从字节数组创建的输出位图中的未对齐

时间:2012-09-12 15:36:27

标签: c# bitmap

我试图理解为什么我从字节数组创建Bitmap时遇到麻烦。我仔细审查了有关字节数组创建位图的现有帖子之后发布的内容,如下所示:

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

我的输入图像是通过特定的perl代码创建的一个简单的图像:

input image

当然,执行过滤器后输出图像丢失了第一行和最后一行以及第一列和最后一列,由于过滤器管理边框的方式,因此从原始的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);         
}

我得到的输出图像如下:

output image

很明显,我每行丢失一个像素,但我无法理解为什么:

  1. 我已经仔细控制了所有参数:OutputImageColsOutputImageRowsbyte[] byteBuffer长度和内容,甚至将已知值作为测试方式。
  2. 代码几乎与StackOverflow和其他地方发布的其他代码相同。
  3. 有人可能会帮助确定问题所在?

1 个答案:

答案 0 :(得分:0)

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