2

我试图理解为什么我无法从字节数组创建位图。在仔细审查了有关从字节数组创建位图的现有帖子后,我发布了这个帖子,如下所示:

我的代码旨在对 8bppIndexed 数字图像执行过滤器,将像素值写入 byte[] 缓冲区,以便在 8BppIndexed 位图中再次转换(经过一些处理以管理灰度级)

我的输入图像是通过特定 perl 代码创建的普通图像:

输入图像

当然,在执行过滤器后,由于过滤器管理边界的方式,输出图像丢失了第一行和最后一行以及第一列和最后一列,因此从原始 256 x 256 图像中我得到了 254 x 254 图像。

只是为了专注于这个问题,我已经评论了负责执行过滤器的代码,以便真正执行的操作是显而易见的:

ComputedPixel = InputImage.GetPixel(myColumn, myRow).R;  

我知道,我应该使用锁定和解锁,但我更喜欢一个一个头痛。无论如何,这段代码应该是一种身份转换,最后我使用:

private unsafe void FillOutputImage()
{           
    OutputImage = new Bitmap (OutputImageCols, OutputImageRows, PixelFormat .Format8bppIndexed);
    ColorPalette ncp = OutputImage.Palette;
    for (int i = 0; i < 256; i++)
        ncp.Entries[i] = Color .FromArgb(255, i, i, i);
    OutputImage.Palette = ncp;

    Rectangle area  = new Rectangle(0, 0, OutputImageCols,  OutputImageRows);
    var data = OutputImage.LockBits(area, ImageLockMode.WriteOnly, OutputImage.PixelFormat);
    Marshal.Copy(byteBuffer, 0, data.Scan0, byteBuffer.Length);

    OutputImage.UnlockBits(data);         
}

我得到的输出图像如下:

输出图像

很明显,我每行丢失一个像素,但我不明白为什么:

  1. 我已经仔细控制了所有参数:OutputImageCols,长度OutputImageRowsbyte[] byteBuffer内容甚至写入已知值作为测试的方式。
  2. 该代码与 StackOverflow 和其他地方发布的其他代码几乎相同。

也许有人可以帮助确定问题出在哪里?

4

1 回答 1

0

答案不是我的正确答案,真正的答案来自Hans Passant,它给了我触发解决方案的提示(谢谢,Hans)。我关闭我的答案只是提供一个简单的细节,以防万一有人感兴趣:而不是处理缓冲区,然后通过 Marshal.Copy 复制它,处理不同缓冲区上的 4 字节对齐问题并使用更多内存比严格要求的内存大,我只是使用 LockBits 直接处理图像数据,使用已经为操作设置的数据结构。这是我在编辑给汉斯的问题中考虑的替代方案;我知道很遗憾我的问题没有明确说明。无论如何,现在一切正常。

于 2012-09-13T10:58:44.930 回答