Bitmap RGB24 4字节对齐
本文中说的图片都是无压缩的彩色Bitmap图片。
最近在一个项目中有一个场景是需要将RGB32或RGB24的Bitmap转换成为RGB565的Bitmap,在RGB32转RGB565的过程中没有遇到什么问题:
pixel565[0] = color[0] >> 3;// R pixel565[1] = color[1] >> 2;// G pixel565[2] = color[2] >> 3;// B
但是在将RGB565转换成为RGB24的时候却出现问题了,高宽均100p的图片,用绘图程序绘制出来的大小是374,而我的却是300(图片数据)+54(头部信息)的大小。不明白为何多了20个字节的数据。后来查阅资料后发现是Bitmap的特性。
BMP图像数据,每一行的大小必须是4的倍数,如果不是用0填充,即4字节对齐。
所以加入了行对齐的操作:
int count = 0; int alignNum = 4 - (pixelMat.cols % 4); int alignData = 0; MatConstIterator_<Vec3b> pixel, colorend; for(pixel = pixelMat.begin<Vec3b>(), colorend = pixelMat.end<Vec3b>();pixel != colorend;++pixel) { outFile.write((char*) &(*pixel)[0], 1); outFile.write((char*) &(*pixel)[1], 1); outFile.write((char*) &(*pixel)[2], 1); if(++count % pixelMat.cols == 0) { // 4 bytes align outFile.write((char *) &alignData, alignNum); } }
由此联想,在读取或存储Bitmap图片时需要关注图片一行数据的像素值所占的空间是否进行4字节对齐!
目前项目中处理的流程需要考虑对齐的有:
RGB888->RGB565 读与写
RGB565->RGB888 读与写