Der generische GDI + Fehler beim Speichern einer Bitmap ist offensichtlich ein häufiges Problem meiner Forschung hier auf SO und im Internet. Gegeben folgendes vereinfachtes Schnipsel:GDI + generischer Fehler beim Speichern von Bitmap aus Speicher mit 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");
Dies führt zu dem allgemeinen Fehler 0x80004005. Der übliche Grund dafür sind angeblich Sperren auf Komponenten, aber ich sehe hier nichts. Bin ich nur blind? Der Pfad zu dem ich speichere besteht natürlich nur aus einer leeren bmp Datei (0B).
Hintergrund: Ich erhalte Pixeldaten von einem Kameratreiber, den ich mit einem C++/CLI-Wrapper nach .NET übertrage, sodass das obige Bitmap-Objekt von einem Funktionsaufruf zurückgegeben wird. Aber da dieses kleine Beispiel bereits fehlschlägt, denke ich, dass mit dem Adapter nichts falsch ist.
Alle Vorschläge werden sehr geschätzt!
16-Bit-Graustufen ist vielleicht kein gültiges BMP-Format? –
Ich habe das nicht berücksichtigt, um ehrlich zu sein. Die Umstellung auf 8bpp indiziert erstellt die Datei ohne Fehler. Das ultimative Ziel ist es, das Graustufen-16bpp-Bild als PNG zu speichern, aber das Ersetzen durch "bmp.Save" (@ "name.bmp", ImageFormat.Png); "hat auch nicht funktioniert. – simd
Haben Sie versucht, ImageFormat.Bmp beim Speichern anzugeben? Siehe diese Antwort: http://social.msdn.microsoft.com/Forums/vstudio/en-US/10252c05-c4b6-49dc-b2a3-4c1396e2c3ab/action?threadDisplayName=writing-a-16bit-grayscale-image – Ben