非双字对齐像素到双字对齐位图

时间:2013-02-04 12:20:22

标签: c++ visual-c++ dword

我必须将未与DWORD对齐的原始像素数据(rows * col = 479 * 638)转换为DWORD对齐的位图数据。我几乎没有怀疑。

1)当我说d字对齐是关于分配dword对齐的总内存还是关于使宽度DWORD对齐?

2)假设它是否将实际宽度作为DWORD对齐,那么由于DWORD对齐,我在末尾添加额外的2个字节以使宽度= 640.但是当我从源到目的地进行memcopy时它会离开底部是深黑色的线条。但我不想要这些暗线,因为它会从实际图像中产生混淆。那么我怎么能在最后避免这条黑线?

为了解决这个问题,我假设这是关于dword对齐的总内存分配。我分配了那么多dword对齐的内存。

bitmapData = (LPBYTE) GlobalAlloc(GMEM_FIXED, bmiHeader->biSizeImage);

bmiHeader->biSizeImage = nrows * dowrdalignedwidth * BPP.

在进行实际的memcopy时,我正在复制并写入rows*cols*BPP。这是对的吗?

2 个答案:

答案 0 :(得分:1)

图像的DWORD对齐通常用于步幅,即宽度,并且以字节而不是像素表示。 现在你正在改变你需要的像素数是4的倍数,但这会增加你每行的总字节数远远超过必要的,实际上可能是8个字节。

你要做的是计算(列*每像素的比特数),然后将其与32位对齐以获得你的步幅或宽度。 然后,您可以将其乘以高度以获得完整的图像大小。

因此,对于479 * 638的图像,638是列,因此是宽度 如果你的图像是每个像素4个字节,那么你不需要做任何特殊的事情,因为DWORD是4个字节,所以你的总宽度(以字节为单位)是4个字节或32位的倍数,638 * 4 = 2552.所以只需乘以以高度来获取总图像大小(以字节为单位)。

但是,如果您的图像是每像素3个字节,那么638 * 3 = 1914和1914不是4的偶数倍。 因此,您需要将1914个字节填充到下一个4的倍数。

我通常在C#中这样做,所以我使用的公式是:

((width& bitsPerPixel)+ 31)& ~31

然后将结果除以8,以便在必要时以字节而不是位来获取它。

所以在你的情况下如果你做(638 * 24)/ 8得到1914字节不是DWORD对齐值,但使用上面的公式得到1916这是4字节的偶数倍并且是正确的值为了你的步伐。

答案 1 :(得分:0)

我会说 4bpp 意味着每像素 4 位而不是字节 :) 因此,上面的数学会有所不同