一、背景
存在一个 IR 图(红外线 Infrared Radiation),需要在页面上显示出来,IR 图片格式是 gray8
,即 8 位的灰度图。
Android 上的 Bitmap 图片格式使用的是 ARGB_8888
,所以需要把灰度图转 ARGB 图,每个通道都为 8 位。
二、问题现象
转码思路很简单,就是一个 int 表示一个像素点,刚好是 4 * 8 = 32 位。
那么每一位的值都是等于灰度值,透明度为 0xFF
即可。
Canvas canvas = mCameraView.getHolder().lockCanvas();
// draw ir
int[] pixels = new int[mImageWidth * mImageHeight];
for (int i = 0; i < pixels.length; i++) {
int gray = iru8[i];
pixels[i] = (0XFF000000) | (gray << 16) | (gray << 8) | gray;
}
Bitmap bitmap = Bitmap.createBitmap(pixels, mImageWidth, mImageHeight, Bitmap.Config.ARGB_8888);
canvas.drawBitmap(bitmap, mIRMatrix, null);
然后预览时出现的问题就是下图这样,有很明显的光斑存在:
三、问题解决
首先,上面的现象肯定不是正常的,仔细看看代码,int gray = iru8[i]
这个步骤其实是有问题的,因为 byte
的范围是 -128 ~ 127
的,如果是负数,赋值为 int 的时候问题就大了(毕竟 java 里面也没有无符号数),之后的移位操作就会出错。
所以我们需要如下改动即可:
int gray = iru8[i] & 0xFF;
再运行一下,画面就正常了:
一个小问题,注意注意移位操作中应该多加小心。