【问题标题】:non dword aligned pixel to dword aligned bitmap非双字对齐像素到双字对齐位图
【发布时间】:2013-02-04 12:20:22
【问题描述】:

我必须将非 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.

在进行实际的内存复制时,我正在复制并写信给rows*cols*BPP。这是正确的吗?

【问题讨论】:

  • 等一下,你是先问“如何将数据转换为 DWORD 对齐格式”(无论是什么格式),然后是“什么是 DWORD 对齐格式”?
  • 如果您在谈论图像格式,很可能某些项目或其位置(绝对,从文件开头或相对于其他项目)必须是某物的倍数并且具有与这些相同的项目是否出现在内存中以某种方式对齐的位置几乎没有关系。
  • 你的像素格式是什么,即每个像素有多少位?
  • 嗨 Bartek,我了解 DWORD 对齐。根据我的理解,它是关于确保总大小甚至是 sizeof(DWORD 的倍数。但我的实际问题是,DWORD 是关于通过执行 bitmapData = (LPBYTE) GlobalAlloc(GMEM_FIXED, bmiHeader- >biSizeImage) 或者它是关于使宽度 * 高度 * bpp 作为 DWORD 对齐?
  • bpp = 4;给出一个清晰的概念 - 像素数据有 rows = 479, colns = 638 和 bpp = 4;当我创建一个位图数据以使其与 DWORD 对齐时,我使用一些逻辑并使宽度 = 640。然后它将从 479*638*BPP => 479*640*BPP 写入。因此,由于填充位,最后会出现一条黑线。我在这里做错了吗?

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


【解决方案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 字节的偶数倍,并且是正确的值为了你的步伐。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-24
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2021-04-30
      相关资源
      最近更新 更多