我必须将未与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
。这是对的吗?
答案 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 位而不是字节 :) 因此,上面的数学会有所不同