我试图理解为什么我无法从字节数组创建位图。在仔细审查了有关从字节数组创建位图的现有帖子后,我发布了这个帖子,如下所示:
我的代码旨在对 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);
}
我得到的输出图像如下:
很明显,我每行丢失一个像素,但我不明白为什么:
- 我已经仔细控制了所有参数:
OutputImageCols
,长度OutputImageRows
和byte[] byteBuffer
内容甚至写入已知值作为测试的方式。 - 该代码与 StackOverflow 和其他地方发布的其他代码几乎相同。
也许有人可以帮助确定问题出在哪里?