Frage

Ich mag einige Verarbeitung von Bildern in einer WPF-Anwendung zu tun. Aber ich mag die Pixel eines Bitmap im Speicher zur Laufzeit ändern.

Ich bin die Verwaltung derzeit diese mit ‚unsicher‘ Code gegen einen altmodischen System.Drawing.Bitmap zu tun und es funktioniert ein Genuss (lock einen Arbeitsbereich, Geige mit den Pixeln) Arbeit geleistet. Der Ansatz wird in diesem Beitrag beschrieben: http://blogs.msdn.com/b/ericgu/archive/2007/06/20/lost-column-2-unsafe-image-processing.aspx

diese Funktion erhalten in WPF ich dann eine WPF Bitmap zu schaffen mit diesem Ansatz:

    BitmapSource destination;
    IntPtr hBitmap = bitmap.GetHbitmap();
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
    destination = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, sizeOptions);
    destination.Freeze();
    return destination;

Dies schafft jedoch viele Kopien im Speicher und ich möchte wirklich da drin und Geige mit den darunterliegenden Bits innerhalb des Bitmapsource erhalten wie EricGu im Bitmap Beispiel zeigte. Ist das möglich?

Ich weiß, dass Pixelshader dies wahrscheinlich tun können, aber das ist eine akademische Übung mit Beteiligung mehrerer Threads (die unterstützt wird, wenn eine Bitmap im unsicheren Modus bearbeiten).

Vielen Dank im Voraus

War es hilfreich?

Lösung

Ich werde Ihnen so viel sagen, wie ich weiß.

Zuerst erscheinen Sie bereits wissen, über Bitmaps Einfrieren bevor sie wieder zu dem Haupt-Thread zu geben. Das ist ein guter Anfang.

Ich habe einmal versucht, das Kopieren zu reduzieren, indem eine neue Implementierung von Bitmap abzuleiten, und die virtuellen Funktionen außer Kraft setzen, die Ihre Daten aus dem Bitmap kopieren. Es funktionierte aber produzierte massive Speicherlecks. Es nie herausgefunden.

Sie können natürlich auch eine Bitmapsource erstellen direkt aus einem Array von Bytes (und verliert Overhead des GDI-Bitmap). Msdn docs

Haben Sie darüber nachgedacht ein Writeablebitmap ? Das war die Antwort des WPF-Team auf die gemeinsame Beschwerde über das gesamte Kopieren.

Bearbeiten : MSDN sagt ausdrücklich (in WritableBitmap.BackBuffer Dokumentation), dass es von einem Hintergrund-Thread verwendet werden kann:

  

Sie können den Backbuffer Zeiger passieren zu   externe Komponenten und andere Threads   für die Verarbeitung, aber wenn Sie tun, Sie   müssen Sie eigenen Thread liefern   Koordinierung. Insbesondere müssen Sie   sicherzustellen, dass die UI-Thread Spezifiziert   veränderte Bereiche von dem anruf   AddDirtyRect Methode, und dass die UI   Faden entriegelt den Puffer durch Aufrufen   die Methode Unlock.

Wenn Sie also das UI-Thread aquire die Sperre lassen und den Zeiger, können Sie ein Worker-Thread schreiben die Pixel lassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top