资源简介
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 Mp3 本地音乐播放器
- Android头像设置demo,支持从相册选择和
- Android+个人记账程序源码
- 安卓开发兼容包:android-support-v8-ren
- 有关Android技术的英文文献翻译
- Android编程权威指南挑战练习参考答案
- Android编程权威指南挑战练习参考答案
- ivona TTS 安卓优秀的语音朗读引擎
- android发送邮件三件套mail.jar activatio
- Android应用源码动态壁纸开发必看源码
- Android 4.4、5.1、6.0 屏蔽Home键
- 跨平台声声波信代码支持Android/IOS/L
- 完整版android视频播放器
- android-support-v4 21.0.3
- Android蓝牙串口调试助手 蓝牙通信 透
- Android 高仿iphone滑动解锁源代码,详见
- Android仿iphone滑动解锁,先看效果,代
- Android变声功能Demo
- 正确的Android TCP实现方法Wifi测试通过
- Android鼠标简易版
- android象棋源码
- Android精美时钟代码
- android仿QQ界面
- Android CMakeLists生成多个so文件
- 最新的support-v4 jar包
- android opengl 魔方源代码
- XDA签名工具
- 非阻塞socket实现android手机与PC的文件
- androideventbus-1.0.5.jar
- Android Spinner
评论
共有 条评论