资源简介
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 - 上一篇:XSS检测原型系统
- 下一篇:gson-2.6.2.jar
相关资源
- Android手机工具ADB.exe
- adb 1.0.31版本--解决4.3android系统adb of
- AndroidStudio版直连sqlserver
- android带百分比进度条的文件上传,使
- 美食天下项目Android版源码和Web版源码
- Android之自定义ToggleButton使用
- Android非常漂亮的登录界面
- pc与android通过usb socket实现手机通信
- android毕业设计
- 百度地图自定义Markerandroid
- Android分区工具包
- android-support-v4.jar已打包进去源代码
- u-blox_Android_GNSS_Driver_v3.10驱动源码+中
- 个人根据Android移动开发案例详解手写
- android 视频播放器 项目和原码
- Android【动画】【特效】 17种动画特效
- 基于Android智能家居详细设计(经典)
- android通过JDBC连接Mysql数据库
- Android通讯录的源代码
- android 瀑布流Demo
- 指纹传感器FPC1080在android下的驱动
- delphi xe5 android 调用照相机摄像头拍照
- Android手机连连看游戏源码
- android-sdk-windows v2.3离线完整版
- android 底部弹出菜单(带透明背景)
- Android工程模式简介.rar
- Android蓝牙和Cors网络开发源码
- Android powermanger wakelock
- Android v7的一些jar包
- 最新android supportV7包
川公网安备 51152502000135号
评论
共有 条评论