java图片转单色位图_Android:将位图转换为单色位图(每像素1位)

博主正在尝试将彩色位图转换为单色位图,以便能正确打印到移动蓝牙打印机Bixolon SPP-R200。他们通过Canvas在位图上绘制文本,然后试图将位图转换为ByteArray。问题在于打印机无法处理转换后的字节。博主计划通过getPixels方法获取每个像素,并将它们简化为黑白(1或0)。目前,他们需要确定如何评估像素颜色以决定其黑白状态,并询问这种方法是否有效以及如何最有效地实现这一过程。
摘要由CSDN通过智能技术生成

我想将位图打印到移动蓝牙打印机(Bixolon SPP-R200)-SDK不提供直接方法来打印内存图像。所以我想到了这样转换一个位图:

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

到单色位图。我正在使用Canvas在给定的位图上方绘制黑色文本,效果很好。但是,当我将上述位图转换为ByteArray时,打印机似乎无法处理这些字节。我怀疑我需要一个每个像素一位的数组(一个像素将是白色= 1或黑色= 0)。

似乎没有方便的开箱即用的方法,我的一个想法是使用:

bitmap.getPixels(pixels, offset, stride, x, y, width, height)

获取像素。我想,我必须按如下方式使用它:

int width = bitmap.getWidth();

int height = bitmap.getHeight();

int [] pixels = new int [width * height];

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

但是-我不确定几件事:

在getPixels中-仅将宽度作为“ Stride”参数传递是否有意义?

我想我必须评估每个像素的颜色信息并将其切换为黑色或白色(然后将此值写入新的目标字节数组中,最终将其传递给打印机)?

如何最好地评估每个像素颜色信息以决定它应该是黑色还是白色?(渲染的位图是白色背景上的黑色痛苦)

这种方法有道理吗?有没有更简单的方法?仅将位图设置为黑白是不够的,主要问题是将每个像素的颜色信息减少为一位。

更新

正如Reuben建议的那样,我首先将位图转换为单色位图。然后遍历每个像素:

int width = bitmap.getWidth();

int height = bitmap.getHeight();

int[] pixels = new int[width * height];

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

// Iterate over height

for (int y = 0; y < height; y++) {

int offset = y * height;

// Iterate over width

for (int x = 0; x < width; x++) {

int pixel = bitmap.getPixel(x, y);

}

}

现在Reuben建议“读取每个32位像素的最低字节”-这与我有关如何评估像素颜色的问题有关。我在这方面的最后一个问题:是否通过执行以下操作获得最低字节:

// Using the pixel from bitmap.getPixel(x,y)

int lowestByte = pixel & 0xff;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是将一张24位图转换单色位图的 MFC 代码: 1. 创建一个 CBitmap 对象,加载原始的 24 位图: CBitmap bmp; bmp.LoadBitmap(IDB_24BITMAP); 2. 获取原始位图的宽度和高度: BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); int width = bmpInfo.bmWidth; int height = bmpInfo.bmHeight; 3. 创建一个与原始位图相同大小的单色位图: CBitmap monoBmp; monoBmp.CreateBitmap(width, height, 1, 1, NULL); 4. 为单色位图创建一个 CDC 对象: CDC monoDC; monoDC.CreateCompatibleDC(NULL); 5. 将单色位图选入 CDC 对象: CBitmap* pOldBmp = monoDC.SelectObject(&monoBmp); 6. 将原始位图绘制到单色位图上,并使用 SetPixel 来将每个像素设置为黑色或白色: CDC bmpDC; bmpDC.CreateCompatibleDC(NULL); CBitmap* pOldBmp2 = bmpDC.SelectObject(&bmp); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { COLORREF color = bmpDC.GetPixel(x, y); BYTE r = GetRValue(color); BYTE g = GetGValue(color); BYTE b = GetBValue(color); BYTE gray = (BYTE)((r + g + b) / 3); if (gray > 128) { monoDC.SetPixel(x, y, RGB(255, 255, 255)); } else { monoDC.SetPixel(x, y, RGB(0, 0, 0)); } } } 7. 将 CDC 对象中的单色位图保存到文件: monoBmp.SaveBMP(_T("mono.bmp")); 8. 释放对象: bmpDC.SelectObject(pOldBmp2); monoDC.SelectObject(pOldBmp); 注意:这段代码只能将 24 位图转换成黑白单色位图,如果您需要将其转换成灰度单色位图,可以使用不同的算法来计算每个像素的灰度值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值