Ich muss eine Bitmap, die ich von einer Kamera erhalte, in eine BitmapSource kopieren, um sie in einer WPF-Anwendung anzuzeigen. Bild kommt in PixelFormat.Format24bppRgb mit einem negativen Schritt. Ich habe dies funktioniert durch folgenden CodeBlaue und rote Kanäle, die während der Konvertierung von Bitmap in Bitmapquelle ausgetauscht werden
//NOTE: image is in PixelFormat.Format24bppRgb
var bitmap = imageBuffer.Bitmap;
Image = new WriteableBitmap(bitmap.Width, bitmap.Height, 96, 96, PixelFormats.Rgb24, null);
var bitmapData = bitmap.LockBits(
new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);
var rowSize = bitmapData.Stride < 0 ? -bitmapData.Stride : bitmapData.Stride;
var bitmapPtr = bitmapData.Scan0;
var bitmapLine = new Int32Rect(0, 0, bitmap.Width, 1);
for (int line = 0; line < bitmap.Height; line++)
{
Image.WritePixels(bitmapLine, bitmapPtr, rowSize, rowSize, 0, line);
bitmapPtr += bitmapData.Stride;
}
bitmap.UnlockBits(bitmapData);
Das Problem, das ich läuft ist, dass blaue und rote Kanäle zu tauschen scheinen. Ich könnte das Problem lösen, indem ich die BitmapSource aber da in der Anwendung ich auch einige Bildverarbeitung vor der Konvertierung machen möchte, würde ich lieber Dinge in einem korrekten Format davor haben. Tue ich etwas falsch in der Konvertierung oder ist das eine GDI-Besonderheit?
Beachten Sie, dass das Bild korrekt angezeigt wird, wenn ich das Kamera-Bitmap direkt auf ein WinForms-Bildfeld anwende. Auch WriteableBitmap wird nur aus Gründen der Code-Kürze neu erstellt.
Wenn das Bildformat RGB ist, aber die Schrittweite negativ ist, dann ist das Bildformat BGR, da es rückwärts gelesen wird. – Gusman
Soll das für Bitmaps immer so sein? Wenn ja, würde ich das als Antwort akzeptieren. – Rok
Ja, es ist normal, negativer Schritt, denn es ist ein Bild von unten nach oben statt von oben nach unten, normalerweise würden die Draw-Operationen von Graphics diese Dinge für Sie erledigen, aber die Image-Klasse WritePixels erlaubt keinen negativen Schritt, Sie müssen also das Pixelformat (BGR) umkehren – Gusman