RAW图片格式转化01

865 阅读2分钟

这是我参与2022首次更文挑战的第1天,活动详情查看2022首次更文挑战

在最近的工作中,要求实现一个RAW格式转化工具,实现RAW图片的packed和unpacked,LSB和MSB格式之间的转化。因为网上并没有相关算法的实现和文章,所以想在这里记录一下实现方法,方便以后回忆,同时也给大家提供一种实现思路。

首先推荐一个好用的RAW图片查看工具,7yuv,下面是该工具的使用截图:

{06d767af-b218-4b73-8fc5-8f9bc5d4afab}.png

文件信息选择

支持的RAW图片格式有下列几种,要选择正确的格式:

  • Bayer RGGB 16-bit
  • Bayer GRBG 16-bit
  • Bayer GBRG 16-bit
  • Bayer BGGR 16-bit

分辨率

选择正确的图片格式填写宽高

大小端

Endianess是字节序的意思也就是图片编码是大端格式还是小端格式,LE是小端BE是大端。

有效位

Bits代表图片的有效位,可以用于查看的RAW图片占位都是16bit,但是有效位不一定是16bit,还可以是8bit,10bit,12bit,14bit。

当上述信息都填写正确以后图片就可以显示出来了,注意RAW图片显示会颜色偏绿,这是因为RAW图片的编码方式中G分量所占的比例是R B分量的两倍。

16bitRAW图大小端转化

上面介绍了如何查看RAW图片,接下来对RAW图片进行最简单的大小端转化(针对16bit的图片即unpacked格式,但是不是指有效位)

RC Raw16bChangeSB(unsigned short *src_buf, unsigned short *dst_buf, int pixel_num) {
  if (0 >= pixel_num) {
    return EG_WRONG_ARG;
  }
  for (int i = 0; i < pixel_num; i++) {
    dst_buf[i] = ((src_buf[i] & 0xFF00) >> 8) | ((src_buf[i] & 0x00FF) << 8);
  }
  return RC_SUCCESS;
}

将RAW Data以字节流的方式读入,在将buffer里面每一位的前8位和后八位替换,就完成了大小端的转化工作了。

后续更新packed和unpacked格式之间的转化实现方式。