【Android实现16位灰度图数据转RGB数据并以bitmap格式显示】

Android实现16位灰度图数据转RGB数据并以bitmap显示(单通道Gray数据转三通道RGB数据并显示)

需求

问题需求:项目上需要实现将深度相机传感器给出的数据实时显示出来的功能。经过了解得知,传感器给出的数据为16位灰度图数据,即16位数据表示一个像素的颜色信息(单位像素占用的字节数为2字节)。

发现问题

Android 默认的图片编码格式是BitMap(位图),
而BitMap的像素格式配置主要是由Bitmap.Config控制的
它表了Bitmap可以的配置情况。这个配置描述的是这些像素信息是如何存储的。这个影响到了图片质量和透明度。
常见配置项如下

  public static enum Config {
    ALPHA_8,//代表8位Alpha位图 每个像素占用1byte内存
    RGB_565,//代表16位RGB位图 每个像素占用2byte内存
    /** @deprecated */
    @Deprecated
    ARGB_4444,//代表16位ARGB位图 每个像素占用2byte内存
    ARGB_8888,//代表32位ARGB位图 每个像素占用4byte内存
    RGBA_F16,
    HARDWARE;

    private Config() {
    }
  }

这里我需要解码显示的数据为单通道只有灰度信息的数据,而BitMap显示需要RGB三个通道的颜色信息,因此无法直接将数据转换成BitMap进行显示。

遇见问题老样子先百度无果再google无果再GitHub仍然无果。大多数搜索内容都是图片灰度化即彩色图片灰度化显示为灰色图片。或者就是需要使用OpenCV库来实现。由于我不想额外接入OpenCV库。所以只能自己来实现一下

解决方案

首先经过分析
RGB_565它的格式为 5位red数据,6位green数据 5位blue数据一共16位数据位
ARGB_4444则是ARGB A(alpha)R(red)G(green)B(blue)各4位数据位,共16位数据位。多了4位表示透明度信息。
ARGB_8888则是ARGB A(alpha)R(red)G(green)B(blue)各8位数据位,共32位数据位。

目前的具体思路是将单通道的Gray数据分别添加到构造BitMap需要的RGB三个通道中,
而根据上述分析发现RGB_565和ARGB_4444需要对数据做特殊的处理而ARGB_8888每个通道都是8位数据刚好一个字节处理起来比较方便。因此选用ARGB_8888格式进行构造。
然而倘若把每个字节16位数据分别塞到RGB三个通道中,每个通道只需要8位数据。因此又涉及到16位高精度转8位低精度。因此代码如下

/**
   * 16位灰度数据转8位灰度数据
   * @param bytes16 原数据为16位精度的灰度数据(每个像素用16位数据表示)
   * @return ByteArray 利用数据类型转换降低精度变为8位灰度数据
   * 每16位两个字节数据转为两字节数据类型Short,再将Short转换为一字节数据类型Byte实现16位转8位
   */
  fun bit16ToBit8(bytes16: ByteArray): ByteArray {
    Log.d(TAG, "bit16ToBit8: ${bytes16.size}")
    val bytes8 = bytes16
      .asList()
      .chunked(2)
      .map { (l, h) ->
        (l.toInt() + h.toInt().shl(8)).toShort()
      }
      .map {
        it.toByte()
      }.toByteArray()
    Log.d(TAG, "bit16ToBit8: ${bytes8.size}")
    return bytes8
  }
  /**
   * 单通道灰度转三通道RGB数据 原为 G(Gray) 转为 R(Red) G(Green) B(Blue)
   */
  fun grayToRgb(bytes: ByteArray): ByteArray {
    val res = mutableListOf<Byte>()
    var item: Byte
    for (i in bytes.indices) {
      item = bytes[i]
      res.add(item) // red
      res.add(item) // green
      res.add(item) // blue
    }
    return res.toByteArray()
  }

  /**
   * 三通道数组转3通道bitmap
   */
  fun rgb2BitmapFor323(data: ByteArray?, width: Int, height: Int): Bitmap? {
    try {
      val colors = convertByteToColor323(data) ?: return null //取RGB值转换为int数组
      return Bitmap.createBitmap(
        colors, 0, width, width, height,
        Bitmap.Config.ARGB_8888
      )
    } catch (e: Exception) {
    } finally {
    }
    return null
  }

/**
   * 将纯RGB数据数组转化成int像素数组,转三通道
   *
   * @param data rgb数组 输入为三通道
   */
  private fun convertByteToColor323(data: ByteArray?): IntArray? {
    var size = -1
    if (data != null) {
      size = data.size
    }
    if (size == 0) {
      return null
    }
    var arg = 0
    if (size % 3 != 0) {
      arg = 1
    }
    // 一般RGB字节数组的长度应该是3的倍数,
    // 不排除有特殊情况,多余的RGB数据用黑色0XFF000000填充
    val color = IntArray(size / 3 + arg)
    var red: Int
    var green: Int
    var blue: Int
    val colorLen = color.size
    if (arg == 0) {
      for (i in 0 until colorLen) {
        red = convertByteToInt(data!![i * 3])
        green = convertByteToInt(data[i * 3 + 1])
        blue = convertByteToInt(data[i * 3 + 2])
        // 获取RGB分量值通过按位或生成int的像素值
        color[i] = red shl 16 or (green shl 8) or blue or -0x1000000
      }
    } else {
      for (i in 0 until colorLen - 1) {
        red = convertByteToInt(data!![i * 3])
        green = convertByteToInt(data[i * 3 + 1])
        blue = convertByteToInt(data[i * 3 + 2])
        color[i] = red shl 16 or (green shl 8) or blue or -0x1000000
      }
      color[colorLen - 1] = -0x1000000
    }
    return color
  }

  /**
   * 将一个byte数转成int
   * 实现这个函数的目的是为了将byte数当成无符号的变量去转化成int
   *
   * @param data byte字节
   */
  private fun convertByteToInt(data: Byte): Int {
    val heightBit = (data.toInt() shr 4 and 0x0F)
    return heightBit * 16 + (0x0F and data.toInt())
  }

源数据:data=" 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"
效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值