我们知道数字图像的像素段可以简单看成一个二维的数组。
但如果每行的长度不是4字节的倍数,DIB处理中行需要补零,那么像素在内存中的存储便不是一直连续的。既然不是连续的,请问又如何以数组的方式对图像进行操作,而这样的数组又如何和指针建立联系。
当然,如果我们忽略上面的问题,可以单纯的拿指针去处理。但24位,16位,以及8位之间的转换依然非常麻烦,他们每行补零的情况又各有不同。
请各位指点迷津。

解决方案 »

  1.   

    用您的方法的确可以实现,但比较疑惑的是,读取和存储新格式时(比如24bmp转256gray),要分别对行末进行判断和处理。
    但看相关书籍和资料,并没有人特别对补零进行处理。
      

  2.   

    用您的方法的确可以实现,但比较疑惑的是,读取和存储新格式时(比如24bmp转256gray),要分别对行末进行判断和处理。
    但看相关书籍和资料,并没有人特别对补零进行处理。
      

  3.   

    DIB不能当作二维数组来处理,应先计算出每行的字节数((像素个数*颜色位数+31)/32*4),逐行处理。如果觉得补0麻烦,可以先把目标内存全部填0,再写入像素数据,这样做速度稍慢一点,不过一般是可以忽略的。
      

  4.   

    字节数((像素个数*颜色位数+31)/32*4)
    就是这个公式就可以了,指针指到0的时候就跳过去,不要读取就可以了
    [/Quote]像素位也可能是0啊。。
      

  5.   

    为什么不能看成二维数组,完全可以而且事实上很多图像操作就是获取buffer然后使用二维数组的方式来操作。
    边界对齐根本没什么影响,你的二维数组也一样边界对其不就行了。本质上C/C++的[]操作也就是指针操作而已,既然每行的数据长度是相同的当然可以作为二维数组来用。
      

  6.   

    作为二位数组并无问题
    核心是计算每行的字节数,就是一个简单的4字节对齐(实际上是补位(32BITS))的问题
    进行渲染的时候,不是按二位数组的尺寸,而是实际的图像宽度(头中的定义)进行,按行
      

  7.   

    是的,逐行处理,按照图形的真实宽度(width)处理,忽略补位,理论上,黑白位图,行数据可能有31bits的补位,如果错误理解,则可能输出31像素的额外宽度:)
      

  8.   

    bmp位图行数据是上下倒置的(从基线开始),这一点也要注意