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 读与写