Android中将bitmap转换成单色的BMP图片

图片片转换成位深度为1的单色bmp照片   最近调用热敏打印机需要打印单色,位深度为1的bmp照片,找了半天网上都是半成品,最后实现了,先谢谢各位大神,整体还是很有帮助,但是还是有些差距。   第一次写博客,不怎么会写,可能语言描述不是很好,但是代码是完完整整写入,写对static void Main(string[] args)        {           Bitmap b = (Bitmap)Bitmap.FromFile... 阅读详情

最近想把bitmap转成单色的BMP图片,没有找到现成的方法,经过一番努力最终成功转换.

首先找到一篇文章,把bitmap转换成BMP图片 http://coderlxl201209164551.iteye.com/blog/1765740

发现博主转换的BMP图片为24位色的,而我需要的单色的.我看到博主转换成24位色的BMP图片时,给bitmap增加了一些数据,这些数据貌似是BMP图片的一些信息,所以找到一篇了BMP文件结构的文章  http://www.cnblogs.com/kingmoon/archive/2011/04/18/2020097.html。发现在位图信息头里面有一个表示BMP图像的色深的字段。前面博主使用的是0x18 0x00  0x18转换成十进制为24所以生成的图片为24位的,想要生成单色的图片话把0x18改成0x01,图片就成了单色。又看到BMP文件结构里面有句话“彩色表/调色板(color table)是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像 的数据是指向调色板的索引。“因为24位色的BMP图片不存在调色板。如果我要改成单色的话就得加上一个大小为2的调色板,每个调色板的大小为4字节。在24位色中每3个字节表示一个点,而在单色中每个bit表示一个点。所以循环取到bitmap中每个像素点,(ps:在bitmap中每4个字节表示点),将每个点用1bit来表示。由于我在使用bitmap之前先将bitmap变成黑白色的,所以我只需要判断哪些像素点为黑色就将那个bit置为1。如此转换就将24位色的BMP图片转成了单色的BMP图片.


PS:原博主转换成BMP图片有个bug,BMP文件头中3-6字节表示BMP图像文件的大小,而原博主使用的是BMP图像数据大小,而位图信息头中21-24表示BMP图像数据大小而博主给的是0。这种情况下WINDOWS显示没问题,但是android系统识别文件大小为0。



以下附上源码,但是我的代码存在一个问题,BMP图像的宽度只能为N*8*4,BMP文件结构说明有这么一句话"

BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足",但是我补0了转换出来的BMP文件还是有问题,如果有知道原因的,还请留言告知...


附源码:

/**将bitmap转换成bmp格式图片
  * @param bitmap 要转换的bitmap

* @param fos bmp文件输出流
  */
 private void FormatBMP(Bitmap bitmap,FileOutputStream fos)
 {
  if (bitmap != null) {
   int w = bitmap.getWidth(), h = bitmap.getHeight();
   int[] pixels=new int[w*h];
   bitmap.getPixels(pixels, 0, w, 0, 0, w, h);//取得BITMAP的所有像素点

   byte[] rgb = addBMP_RGB_888(pixels,w,h);
   byte[] header = addBMPImageHeader(62+rgb.length);
   byte[] infos = addBMPImageInfosHeader(w, h,rgb.length);
   byte[] colortable = addBMPImageColorTable();

   byte[] buffer = new byte[62 + rgb.length];
   
   System.arraycopy(header, 0, buffer, 0, header.length);
   System.arraycopy(infos, 0, buffer, 14, infos.length);
   System.arraycopy(colortable, 0, buffer, 54, colortable.length);
   System.arraycopy(rgb, 0, buffer, 62, rgb.length);
   try {
    fos.write(buffer);
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 // BMP文件头
 private byte[] addBMPImageHeader(int size) {
  byte[] buffer = new byte[14];
  buffer[0] = 0x42;
  buffer[1] = 0x4D;
  buffer[2] = (byte) (size >> 0);
  buffer[3] = (byte) (size >> 8);
  buffer[4] = (byte) (size >> 16);
  buffer[5] = (byte) (size >> 24);
  buffer[6] = 0x00;
  buffer[7] = 0x00;
  buffer[8] = 0x00;
  buffer[9] = 0x00;
//  buffer[10] = 0x36;
  buffer[10] = 0x3E;
  buffer[11] = 0x00;
  buffer[12] = 0x00;
  buffer[13] = 0x00;
  return buffer;
 }


 // BMP文件信息头
 private byte[] addBMPImageInfosHeader(int w, int h, int size) {
  
  Log.i("_DETEST_", "size="+size);
  byte[] buffer = new byte[40];
  buffer[0] = 0x28;
  buffer[1] = 0x00;
  buffer[2] = 0x00;
  buffer[3] = 0x00;
  
  buffer[4] = (byte) (w >> 0);
  buffer[5] = (byte) (w >> 8);
  buffer[6] = (byte) (w >> 16);
  buffer[7] = (byte) (w >> 24);
  
  buffer[8] = (byte) (h >> 0);
  buffer[9] = (byte) (h >> 8);
  buffer[10] = (byte) (h >> 16);
  buffer[11] = (byte) (h >> 24);
  
  buffer[12] = 0x01;
  buffer[13] = 0x00;
  
  buffer[14] = 0x01;
  buffer[15] = 0x00;
  
  buffer[16] = 0x00;
  buffer[17] = 0x00;
  buffer[18] = 0x00;
  buffer[19] = 0x00;
  
  buffer[20] = (byte) (size >> 0);
  buffer[21] = (byte) (size >> 8);
  buffer[22] = (byte) (size >> 16);
  buffer[23] = (byte) (size >> 24);
  
//  buffer[24] = (byte) 0xE0;
//  buffer[25] = 0x01;
  buffer[24] = (byte) 0xC3;
  buffer[25] = 0x0E;
  buffer[26] = 0x00;
  buffer[27] = 0x00;
  
//  buffer[28] = 0x02;
//  buffer[29] = 0x03;
  buffer[28] = (byte) 0xC3;
  buffer[29] = 0x0E;
  buffer[30] = 0x00;
  buffer[31] = 0x00;
  
  buffer[32] = 0x00;
  buffer[33] = 0x00;
  buffer[34] = 0x00;
  buffer[35] = 0x00;
  
  buffer[36] = 0x00;
  buffer[37] = 0x00;
  buffer[38] = 0x00;
  buffer[39] = 0x00;
  return buffer;
 }
 
 private byte[] addBMPImageColorTable() {
  byte[] buffer = new byte[8];
  buffer[0] = (byte) 0xFF;
  buffer[1] = (byte) 0xFF;
  buffer[2] = (byte) 0xFF;
  buffer[3] = 0x00;
  
  buffer[4] = 0x00;
  buffer[5] = 0x00;
  buffer[6] = 0x00;
  buffer[7] = 0x00;
  return buffer;
 }


 private byte[] addBMP_RGB_888(int[] b, int w, int h) {
  int len = w*h;
  int bufflen = 0;
  byte[] tmp = new byte[3];
  int index = 0,bitindex = 1;

  if (w*h % 8 != 0)//将8字节变成1个字节,不足补0
  {
   bufflen = w*h/ 8 + 1;
  }
  else
  {
   bufflen = w*h/ 8;
  }
  if (bufflen % 4 != 0)//BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足
  {
   bufflen = bufflen + bufflen%4;
  }
  
  byte[] buffer = new byte[bufflen];
  
  for (int i = len - 1; i >= w; i -= w) {
   // DIB文件格式最后一行为第一行,每行按从左到右顺序
   int end = i, start = i - w + 1;
   for (int j = start; j <= end; j++) {
    
    tmp[0] = (byte) (b[j] >> 0);
    tmp[1] = (byte) (b[j] >> 8);
    tmp[2] = (byte) (b[j] >> 16);
    
    String hex = "";
    for (int g = 0; g < tmp.length; g++) {
     String temp = Integer.toHexString(tmp[g] & 0xFF);
     if (temp.length() == 1) {
      temp = "0" + temp;
     }
     hex = hex + temp;
    }
    
    if (bitindex > 8)
    {
     index += 1;
     bitindex = 1;
    }
    
    if (!hex.equals("ffffff"))
    {
     buffer[index] = (byte) (buffer[index] | (0x01 << 8-bitindex));
    }
    bitindex++;
   }
  }
  
  return buffer;
 }



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

相关推荐

Bitmap Converter:将图像从一种格式转换为另一种格式(BMP,JPEG,PNG等)-开源

位图转换器是一种用于转换不同类型的位图文件(例如BMP,JPG,PNG,GIF等)的软件。选择目录,然后选择起始格式和目标格式,然后单击确定。

彩色图片如何转为单色位图bmp :用window画板

chenhao0568的专栏 2935

Android中把bitmap存成BMP格式图片的方法

主要介绍了Android中把bitmap存成BMP格式图片的方法,需要的朋友可以参考下

Bitmap转为单色位图,打印电子签名

背景项目中使用手写板,用户在上面签名后,将电子签名传到后台,同时将签名连同别的信息打印出来。手写板已经有很多优秀的开源库,也可以动手撸一个。手写板签名后可以得到签名的Bitmap,而所用的硬件是有打印接口的,可以接收Bitmap为参数打印图片,这样看似需求就能实现了。问题但打印接口接收的Bitmap必须是单色位图,类似于二维码,每个像素点非黑即白,非1即0。其实我们在使用zxing生成二维码时,也利

binaryshao 3344

CHB-MIT波士顿儿童医院癫痫EEG脑电数据处理(一)

CHB-MIT癫痫EEG脑电数据处理CHB-MIT头皮脑电图数据介绍CHB-MIT头皮脑电图数据下载CHB-MIT头皮脑电图数据处理提取原始数据滤波(0.1~50hz)数据分块(时间窗口) CHB-MIT头皮脑电图数据介绍 该数据库收集自波士顿儿童医院,其中包括患有难治性癫痫发作的儿科患者的脑电图记录。停用抗癫痫药物后最多持续几天对受试者进行监测,以表征其癫痫发作并评估其对手术干预的候选资格。 从22位受试者中收集了23个病例的记录(5例男性,3至22岁; 17例女性,1.5至19岁)。 (案例chb21是

AI_DOG的博客 1万+

告别BAPI!深入SAP S/4HANA BP框架:cl_md_bp_maintain维护客户主数据的正确姿势与性能优化

本文深入解析SAP S/4HANA中cl_md_bp_maintain框架的高效实践与架构设计,对比传统BAPI方式,展示其在业务伙伴(BP)主数据维护中的性能优势与现代化特性。通过详细代码示例和性能测试数据,揭示如何利用该框架实现批量处理、集中校验及智能错误恢复,助力企业从ECC向S/4HANA平滑迁移。

weixin_30596735的博客 358

将bitmap修改为灰阶,减小图片大小

public static Bitmap toGrayscale(Bitmap bmpOriginal) { int width, height; height = bmpOriginal.getHeight(); width = bmpOriginal.getWidth(); Bitmap bmpGrayscale = Bitmap.createBitmap(width, height

1608

麒麟和UOS系统编写桌面点击可执行文件

在桌面上创建一个快捷方式(.desktop 文件)来运行脚本。打开文本编辑器,创建一个新文件,如。这可以通过文本编辑器来完成。首先,确保您的脚本具有执行权限。现在,您应该可以双击桌面上的。保存此文件到桌面目录,例如,在桌面上创建一个快捷方式(文件来运行您的脚本了。使用图形界面或命令行给。现在您可以双击桌面上的。为您脚本的实际路径。是您脚本的实际路径。文件来运行您的脚本了。

u013934107的博客 7251

android 24位色bmp图片转单色

如题,我现在是将bitmap转换成了24位色的bmp图片如果我想要将bitmap转换成单色的bmp图片,应该怎么做?

657

洛谷P5707 【深基2.例12】上学迟到(c语言)

第一篇题解 题目描述 yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s\le 10000)s(s≤10000) 米,而 yyy 可以以 v(v<10000)v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。 输入格式 两个正整数 s,v,意思已经在题目中给定

cc_love_program的博客 1万+

GNSS数据资源全解析:从DCB到BSX文件的下载与应用指南

本文系统解析了GNSS数据处理所需的核心数据资源,包括DCB、BSX、SP3、CLK等关键文件的官方下载路径与应用方法。详细介绍了CDDIS、武汉大学镜像站等权威数据源,并提供了从数据下载到实际应用的完整指南,帮助用户高效获取GNSS数据,提升精密定位处理效率。

weixin_29246195的博客 141

android 将bitmap存为 bmp格式图片大小,把bitmap保存成 BMP的格式 并且位深度为1

生成图片的要求:图像格式采用单色位图文件格式(BMP) 要求bmp的位深度为1参考:代码有点小瑕疵 :bitmap的图片宽度要求是:8的整数倍/*** 将Bitmap存为 .bmp格式图片** @param bitmap*/public void saveBmp(Bitmap bitmap) {if (bitmap == null)return;// 位图大小int nBmpWidth = b...

weixin_39977886的博客 922

Robocup3d

一、 比赛介绍 RoboCup 仿真比赛是一个能为多智能体系统和模拟智能进行研究、教育的工具。比赛是在一个标准的计算机环境中进行的,提供了一个完全分布式控制、实时异步多智能体环境。通过这个平台,可以测试各种理论、算法和Agent体系结构。在实时异步、有噪声的对抗环境中,研究多智能体的合作对抗问题。当然,仿真组的比赛使用的机器人并非是真的机器人。一个机器人是一个Agent, 它拥有自己的大脑,

zhanghe2775115的专栏 7267

android 复制bitmap_关于Android bitmap你不知道的一些事

本文为大家分享了Android bitmap使用细节,供大家参考,具体内容如下1、计算机表示图形的几种方式1)BMP :几乎不进行压缩 占用空间比较大2)JPG : 在BMP的基础上对相邻的像素进行压缩,占用空间比BMP小3)PNG : 在JPG的基础上进一步压缩 占用空间比较小这是对三种格式进行一个简单的介绍,知道是怎么回事就行,在Android中一般都用png格式的图片,因为他占用空间小2、图...

weixin_39834984的博客 1356

【以太网硬件十二】以太网端口自协商过程解密之二

简述以太网端口自协商的过程

highman110的博客 2489

QGIS将经纬度坐标转成点

QGIS绘制一张地图

weixin_46713695的博客 6056

生成单色BMP图片

在项目的属性里要勾选 容许不安全代码  public Bitmap ConvertTo24bppTo1bpp(Bitmap SrcImg)         {             unsafe             {                 byte* SrcPointer, DestPointer;                 int Width, Height,...

weixin_34377919的博客 1480

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android studio bitmap转jpg_挖穿Android第四十天

1 计算机表示图形的几种方式 jpg :以良好质量保存 用于计算机和网络 png:以高质量保存用于计算机和网络 bmp 无损 没有经过压缩的图片 以高质量保存用于计算机 1byte = 8bit [1]单色 : 每个像素最多可以表示2种颜色 使用长度为1二进制(0 ,1)就可以表示 那么1一个像素占 1/8byte [2]16色 :每个像素最多可以表示16种颜色 那么只需要使用长度4的二进制位来表...

weixin_39962770的博客 396

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

INAV 位图创建指南:RLE 压缩单色位图的格式、转换与集成

`bitmapDecompress` 是 INAV 飞控固件中负责解压并显示单色位图的底层函数,它只接受经过行程长度编码(RLE)压缩的 1-bit 单色位图数据。本文以 docs/development/Bitmap Creation.md 为主线,完整讲解这类位图必须满足的尺寸、高度、色彩与方向约束,介绍如何用 Gabotronics Image to HEX Converter 将位图转换为

gitblog_00147的博客 233

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

关于bitmap你不知道的一些事

1、计算机表示图形的几种方式1)BMP :几乎不进行压缩 占用空间比较大 2)JPG : 在BMP的基础上对相邻的像素进行压缩,占用空间比BMP小 3) PNG : 在JPG的基础上进一步压缩 占用空间比较小这是对三种格式进行一个简单的介绍,知道是怎么回事就行,在android中一般都用png格式的图片,因为他占用空间小2、图形的大小图形的大小 = 图片的总像素*每个像素的大小 图

asd1031的专栏 2008

android 生成1位图,Android:将位图转换为单色位图(每像素1位)

我想将位图打印到移动蓝牙打印机(Bixolon SPP-R200)--SDK不提供用于打印内存的direkt方法图片。所以我想这样转换一个位图:Android:将位图转换为单色位图(每像素1位)Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);到单色位图。我使用Canvas在上面给出的位图上绘制黑...

weixin_39586526的博客 797

android 图片格式和像素引发的问题

图片的格式有bmp,png,jpg等格式,相对来说,同样一张图片,bmp可能就大点,图片大小是由像素,我们买来的手机的500万像素指的就是这个概念。 比如我们一张应用图标是72*72,那他就是由宽72个像素和高72个像素的组成。 但每个像素是多少大小呢, 像素最大值是ff 在内存中占用8位, R,G,B 3个分别是24位,RGB前面还有个ff表示透明度,所以完成的表示一个颜色的一个像

u014623470的专栏 963

Android图片加载之初步认识bitmap

什么是Bitmap:位图文件(Bitmap),扩展名可以是.bmp或者.dib。位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072KB位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,...

hirezy 354

【Android进阶笔记】图片优化(理论大小和实际大小的计算方式)

文章目录1. 图片压缩格式1.1. 常见的图片格式1.2. WebP格式2. Android内存中的图片2.1. 位图配置Bitmap.Config2.2. 计算占用内存大小2.2.1. 理论值2.2.2. 实际值3. 图片压缩3.1. 质量压缩3.2. 采样率压缩3.3. 尺寸压缩3.4. 图片压缩总结3.5. 实际效果对比 1. 图片压缩格式 1.1. 常见的图片格式 格式 质量 透明 压缩方式 png 较高 支持 图片压缩算法。把相似的颜色压缩在一起 jpg/jpeg 良好 不

Android学习笔记 933
上一篇: 关于android应用程序入口
下一篇: Android N requires the IDE to be running with Java 1.8 or later
小八
博客等级 码龄16年 5粉丝 3原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值