灰度图(IR 图)转成 RGB 图预览,画面出现光斑/黄斑问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/afei__/article/details/84023970

一、背景

存在一个 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;

再运行一下,画面就正常了:
在这里插入图片描述

一个小问题,注意注意移位操作中应该多加小心。

猜你喜欢

转载自blog.csdn.net/afei__/article/details/84023970