这是我参与2022首次更文挑战的第1天,活动详情查看2022首次更文挑战
在最近的工作中,要求实现一个RAW格式转化工具,实现RAW图片的packed和unpacked,LSB和MSB格式之间的转化。因为网上并没有相关算法的实现和文章,所以想在这里记录一下实现方法,方便以后回忆,同时也给大家提供一种实现思路。
首先推荐一个好用的RAW图片查看工具,7yuv,下面是该工具的使用截图:
文件信息选择
支持的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格式之间的转化实现方式。