Warum wirft BitmapSource.Create eine ArgumentException?

7

Ich versuche, eine Bitmap aus Rohdaten zu erstellen, um sie in WPF anzuzeigen, indem ich ein Image und eine BitmapSource verwende:

%Vor%

Der Aufruf von BitmapSource.Create löst jedoch eine ArgumentException aus und sagt, dass "Wert nicht in den erwarteten Bereich fällt". Ist das nicht der Weg dies zu tun? Mache ich diesen Anruf nicht richtig?

    
Mike Pateras 31.12.2009, 03:19
quelle

1 Antwort

36

Dein Schritt ist falsch. Stride ist die Anzahl der Bytes, die für eine Scanlinie der Bitmap. Verwenden Sie daher Folgendes:

%Vor%

und ersetzen Sie den letzten Parameter (derzeit 0 ) durch stride wie oben definiert.

Hier ist eine Erklärung für die mysteriöse Schrittformel:

Fakt: Scanlinien müssen an 32-Bit-Grenzen ausgerichtet sein ( Referenz ).

Die naive Formel für die Anzahl der Bytes pro Scanzeile wäre:

%Vor%

Aber das gibt uns möglicherweise keine Bitmap, die an einer 32-Bit-Grenze ausgerichtet ist, und (Breite * bpp) könnte nicht einmal durch 8 teilbar gewesen sein.

Also, was wir tun, ist, dass wir unsere Bitmap zwingen, mindestens 32 Bits hintereinander zu haben (wir nehmen an, dass width > 0 ):

%Vor%

und dann sagen wir, dass uns die niederwertigen Bits (Bits 0-4) nicht interessieren, weil wir versuchen, uns an 32-Bit-Grenzen auszurichten:

%Vor%

und dann durch 8 dividieren, um zu den Bytes zurückzukehren:

%Vor%

Die Auffüllung kann durch

berechnet werden %Vor%

Die naive Formel wäre

%Vor%

Aber width * bpp wird möglicherweise nicht an einer Bytegrenze ausgerichtet, und wenn dies nicht der Fall ist, würde die Formel das Auffüllen um ein Byte überzählen. (Denken Sie an eine 1 Pixel breite Bitmap mit 1 Bpp. Der Schritt ist 4 und die naive Formel würde sagen, dass die Auffüllung 4 ist, aber in Wirklichkeit ist es 3.) Also fügen wir ein wenig hinzu, um den Fall width * bpp zu decken keine Byte-Grenze und dann erhalten wir die oben angegebene korrekte Formel.

    
jason 31.12.2009, 04:10
quelle

Tags und Links