2 Stimmen

Zwei Bitmaps mit System.Windows.Media.Imaging zusammensetzen

Ich versuche, mit System.Windows.Media.Imaging zwei Bitmaps derselben Größe und desselben Formats zu einer dritten Datei derselben Größe und desselben Formats zusammenzusetzen. Ich tue dies außerhalb des Kontextes von WPF (Arbeit an den Code in LINQPad), da die Absicht ist, dies in eine ASP.net-Anwendung als Alternative zu den nicht unterstützten System.Drawing.

// load the files
var layerOne = new BitmapImage(new Uri(layerOneFile, UriKind.Absolute));
var layerTwo = new BitmapImage(new Uri(layerTwoFile, UriKind.Absolute));

// create the destination based upon layer one
var composite = new WriteableBitmap(layerOne);

// copy the pixels from layer two on to the destination
int[] pixels = new int[(int)layerTwo.Width * (int)layerTwo.Height];
int stride = (int)(4 * layerTwo.Width);
layerTwo.CopyPixels(pixels, stride, 0);
composite.WritePixels(Int32Rect.Empty, pixels, stride, 0);

// encode the bitmap to the output file
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(composite));
using (var stream = new FileStream(outputFile, FileMode.Create))
{
    encoder.Save(stream);
}

Dadurch wird eine Datei erstellt, die mit der von EbeneEins geladenen Datei identisch ist. Ich hatte erwartet, dass EbeneZwei über EbeneEins gelegt wird. Was zu geschehen scheint, ist die Daten in den BackBuffer geschrieben wurde, aber nie auf die Bitmap gerendert wird... vermutlich ist dies etwas, das der Dispatcher normalerweise tun würde.

Was mache ich falsch und wie kann ich wieder auf den richtigen Weg kommen?

3voto

Jeff Ogata Punkte 54689

Das Problem liegt beim ersten Argument für WritePixels die die Fläche des WriteableBitmap zu aktualisieren.

Anstelle von Int32Rect.Empty können Sie etwa wie folgt vorgehen und sollten das zweite Bild über dem ersten sehen:

Int32Rect sourceRect = new Int32Rect(0, 0, (int)layerTwo.Width, (int)layerTwo.Height);
composite.WritePixels(sourceRect, pixels, stride, 0);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X