2016-05-03 3 views
1

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.

+0

Wenn das Bildformat RGB ist, aber die Schrittweite negativ ist, dann ist das Bildformat BGR, da es rückwärts gelesen wird. – Gusman

+0

Soll das für Bitmaps immer so sein? Wenn ja, würde ich das als Antwort akzeptieren. – Rok

+0

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

Antwort

0

die korrekte Umwandlung von System.Drawing.Imaging.PixelFormat.Format24bppRgb zu System.Windows.Media.PixelFormat ist PixelFormats.Bgr24.

Negative Schrittweite hat nichts mit dem Pixelformat zu tun, sondern beschreibt nur die vertikale Drehung des Bildes - von oben nach unten für positiv und von unten nach oben für negativ. Wenn der Schritt eine Auswirkung auf das Pixelformat hätte, hätte der nachfolgende Code die Bilder mit umgekehrten Schritten gespeichert, wobei blauer und roter Kanal ausgetauscht wurden. Dies ist nicht der Fall und der einzige Effekt ist, dass ein Bild vertikal gedreht wird.

var wholeImage = new Rectangle(0, 0, bitmap.Width, bitmap.Height); 
bitmapData = bitmap.LockBits(wholeImage, ImageLockMode.ReadOnly, bitmap.PixelFormat); 
var reverseStride = -bitmapData.Stride; 
var reversedStartPtr = bitmapData.Scan0 + bitmapData.Stride * (bitmapData.Height - 1); 

var reverseStrideBitmap = new Bitmap(bitmapData.Width, bitmapData.Height, 
           reverseStride, bitmapData.PixelFormat, reversedStartPtr); 

bitmap.Save("original.png"); 
reverseStrideBitmap.Save("reversedStride.png"); 
2

Wenn das Bildformat RGB ist, aber der Schritt negativ ist, dann ist das Bildformat BGR, da es rückwärts gelesen wird.

Negative Schritt bedeutet, es ist ein Bild von unten nach oben statt von oben nach unten, normalerweise die Zeichenoperationen von Graphics würde diese Dinge für Sie behandeln, aber die Image-Klasse WritePixels lässt keine negativen Schritt angeben, also müssen Sie umkehren der pixel-Format (BGR)

Verwandte Themen