0

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

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

2)说如果它是关于使实际宽度为 DWORD 对齐,那么由于 DWORD 对齐,我在末尾添加了额外的 2 个字节以使宽度 = 640。但是当我从源到目标进行 memcopy 时,它会留下深黑色底部的线。但我不想要这些暗线,因为它会与实际图像产生混淆。那么我怎样才能避免最后的这条黑线呢?

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

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

在哪里 bmiHeader->biSizeImage = nrows * dowrdalignedwidth * BPP.

在做实际的 memcopy 时,我正在复制和写入rows*cols*BPP. 这个对吗?

4

2 回答 2

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# 中这样做,所以我使用的公式是:

((宽度 & bitsPerPixel) + 31) & ~31

然后将结果除以 8 以根据需要以字节而不是位来获得它。

因此,在您的情况下,如果您执行 (638 * 24) / 8 以获得 1914 字节,这不是 DWORD 对齐的值,但使用上面的公式您会得到 1916,它是 4 字节的偶数倍,并且是您的步幅的正确值.

于 2013-02-04T12:48:09.100 回答
0

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

于 2021-01-19T19:40:12.233 回答