gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:36 24 4
gpt4 key购买 nike

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

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

我的输入图像是通过特定 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 和其他地方发布的其他代码几乎相同。

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

最佳答案

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

关于c# - 从字节数组创建的输出位图中未对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12391763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com