繁体   English   中英

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

[英]Misalignement in the output Bitmap created from a byte array

我试图理解为什么我很难从字节数组创建位图。 在仔细检查了有关从字节数组创建位图的现有文章之后,我将其发布,如下所示:

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

我的输入图像是通过特定的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. 我已经仔细地控制了所有参数: OutputImageColsOutputImageRowsbyte[] byteBuffer长度和内容,甚至编写了已知值来测试。
  2. 该代码与StackOverflow和其他地方发布的其他代码几乎相同。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM