根据我在SO和Web上的研究,保存位图时的GDI +通用错误显然是一个常见问题。给定以下简化片段:GDI +使用LockBits从内存创建的通用错误保存位图
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)替换上述内容;'也不起作用。 – simd
保存时是否尝试过指定ImageFormat.Bmp?看到这个答案:http://social.msdn.microsoft.com/Forums/vstudio/en-US/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab/action?threadDisplayName=writing-a-16bit-grayscale-image – Ben