zoukankan      html  css  js  c++  java
  • Bitmap RGB24 4字节对齐

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

  • 相关阅读:
    695. 岛屿的最大面积(深搜)
    147. 对链表进行插入排序(排序)
    566. 重塑矩阵(模拟)
    238. 除自身以外数组的乘积(前后缀积)
    29.Java基础_接口
    C++ STL queue
    C++ STL stack
    C++ STL string
    C面向接口编程和C++多态案例
    单例模式入门
  • 原文地址:https://www.cnblogs.com/zhanghang-BadCoder/p/7063373.html
Copyright © 2011-2022 走看看