【发布时间】:2020-06-17 18:16:24
【问题描述】:
根据我在 SO 和网络上的研究,保存位图时的 GDI+ 一般错误显然是一个常见问题。给出以下简化的 sn-p:
byte[] bytes = new byte[2048 * 2048 * 2];
for (int i = 0; i < bytes.Length; i++)
{
// set random or constant pixel data, whatever you want
}
Bitmap bmp = new Bitmap(2048, 2048, PixelFormat.Format16bppGrayScale);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, 2048, 2048), ImageLockMode.ReadWrite, bmp.PixelFormat);
System.Runtime.InteropServices.Marshal.Copy(bytes, 0, bmpData.Scan0, 8388608);
bmp.UnlockBits(bmpData);
bmp.Save(@"name.bmp");
这会导致 0x80004005 通用错误。据说通常的原因是组件上的锁,但我在这里看不到任何东西。我只是瞎了吗?我保存的路径是存在的,当然只创建了一个空的bmp文件(0B)。
背景:我从使用 C++/CLI 包装器传输到 .NET 的相机驱动程序中获取像素数据,因此上面的 Bitmap 对象由函数调用返回。但是既然这个小例子已经失败了,我猜适配器没有问题。
非常感谢任何建议!
【问题讨论】:
-
16 位灰度可能不是有效的 bmp 格式?
-
说实话,我没有考虑过。切换到 8bpp 索引创建的文件没有任何错误。最终目标是将灰度 16bpp 图像保存为 PNG,但是将上面的替换为
bmp.Save(@"name.bmp", ImageFormat.Png);也不起作用。 -
您是否尝试过在保存时指定 ImageFormat.Bmp?看到这个答案:social.msdn.microsoft.com/Forums/vstudio/en-US/…
-
还有你在什么平台上?如果 XP 则可能不支持保存 16BppGrayScale。
-
@Ben: Win7 64。还尝试指定
ImageFormat.Bmp。请参阅我的最后一条评论,显然不支持Format16bppGrayscale。但是,我仍然在努力将位图保存为 16bpp 的 PNG。
标签: c# gdi+ system.drawing