根據我在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