• 大小: 9KB
    文件类型: .java
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: Java
  • 标签: Android  Bitmap  单色Bmp  

资源简介

Android不支持将Bitmap转换成单色的Bmp图片,所以参考Bmp格式说明,自己写了一个转换类。亲测有效!!!

资源截图

代码片段和文件信息

package com.lanhetech.core.qrcode.utils;

import android.graphics.Bitmap;

/**
 * 保存为单色位图,即使黑白位图
 */
public class BmpUtil {


    /**
     * 保存为单色bmp格式的完整字节数
     **/
    public static byte[] changeToMonochromeBitmap(Bitmap bmp) {
        int[] binarys = gray2Binary(bmp);
        byte[] data = compressMonoBitmap(bmp binarys);
        byte[] header = addBMPImageHeader(data.length + 62);
        byte[] infos = addBMPImageInfosHeader(bmp.getWidth() bmp.getHeight());
        byte[] buffer = new byte[62 + data.length];
        System.arraycopy(header 0 buffer 0 header.length);
        System.arraycopy(infos 0 buffer 14 infos.length);
        System.arraycopy(data 0 buffer 62 data.length);
        return buffer;
    }

    /**
     * 保存为单色bmp数据,不包含头,正向头
     **/
    public static byte[] changeSingleBytes(Bitmap bmp) {
        int[] binarys = gray2Binary(bmp);
        byte[] data = compressMonoBitmap_ps(bmp binarys);
        return data;
    }

    /**
     * 将彩色图转换为灰阶图,并二值化处理
     *
     * @param bmp 位图
     * @return 返回灰阶图二值化后的颜色int[]
     */
    private static int[] gray2Binary(Bitmap bmp) {
        int width = bmp.getWidth();   // 获取位图的宽
        int height = bmp.getHeight(); // 获取位图的高
        int[] pixels = new int[width * height];  // 通过位图的大小创建像素点数组
        bmp.getPixels(pixels 0 width 0 0 width height);   // int 0 代表0XFFFFFFFF即是1.0完全不透明,0.0f完全透明。黑色完全透明。
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                int grey = pixels[width * i + j];  // 第几行,第几个
                // 分离三原色
                int alpha = ((grey & 0xFF000000) >> 24); // 透明度
                int red = ((grey & 0x00FF0000) >> 16);   // 红色
                int green = ((grey & 0x0000FF00) >> 8);  // 绿色
                int blue = (grey & 0x000000FF);          // 蓝色
                if (alpha == 0) {  // 透明度为0,则说明没有颜色,那变更为白色
                    pixels[width * i + j] = 0;           // 白色是0
                    continue;
                }
                grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11);  // 转化为灰度图  灰度值:255为白色,0为黑色
                // TODO: 2016/12/27 灰度值为200,可调整该参数
                grey = grey < 200 ? 1 : 0;  // 灰度小于200就转化为黑色,不然就为白色。200为可调整参数。// 二值化
                pixels[width * i + j] = grey;
            }
        }
        return pixels;
    }


    /**
     * 压缩为完整单色bmp数组,并反向
     *
     * @param bmp     压缩需要用到位图的宽度,高度。
     * @param binarys 二值化数据
     * @return
     */
    private static byte[] compressMonoBitmap(Bitmap bmp int[] binarys) {
        int width = bmp.getWidth();   // 获取位图的宽
        int height = bmp.getHeight(); // 获取位图的高
        // 行补位的公式为 widthBytes = (width*biBitCount+31)/32*4
        // 需要转化为单色,所以biBitCount=1;
        // 确定一行几个字节
        int widthBytes = (width + 31) / 32 * 4;

        byte[] newss = new byte[widthBytes * height];
        for (int i = height; i > 0; i--) {
            for (int j 

评论

共有 条评论