Frage

Ich habe zwei Bitmaps, durch verschiedene Varianten eines Algorithmus erzeugt. Ich möchte eine dritte Bitmap erstellen, indem man von dem anderen subtrahiert wird, die Unterschiede zu zeigen.

Wie kann dies in .NET getan werden? Ich habe die Graphics-Klasse sah über und alle Optionen, einschließlich der Imageattributes Klasse, und ich habe das Gefühl, es beinhaltet die Farbmatrix oder neu zuordnen Tabellen-Funktionalität.

Hat jemand einen Link zu einigen Beispiel-Code haben, oder mich in die richtige Richtung zeigen kann? Eine Google-Suche zeigt nicht viel, es sei denn, mein Google-Fu mich heute versagt.

War es hilfreich?

Lösung

Die eigentliche Frage ist, welche Unterschiede wollen Sie zeigen? Wenn Sie nur auf RGB-Farbwerte arbeiten müssen, die beste Wette ist meiner Meinung nach nur durch beide Bitmaps zu scannen und die Farbwerte mit GetPixel vergleichen, und verwenden Sie SetPixel Ihre ‚Differenz‘ Bitmap zu erzeugen. Vielleicht möchten Sie einfach die Werte subtrahieren und diejenigen als neuer Farbwert für die dritte Bitmap verwenden. Oder vielleicht möchten Sie die Leuchtkraft berechnen und diese verwenden. Noch besser ist, wenn man zum Vergleich drei Metriken haben, weisen jeweils eine an die R G und B-Komponenten der Farbe. Ich habe diesen Ansatz für fraktale Einfärben verwendet vor.

Es gibt auch andere Ansätze, aber mit diesem einen sind Sie beschränkt sich nur auf Ihre Phantasie. Es ist vielleicht nicht der schnellste Ansatz sein, aber es klingt nicht wie die Leistung für dieses Szenario erforderlich ist.

Andere Tipps

Dieses Projekt Check out. Es ist ein Bewegungsmelder, hergestellt von Andrew Kirillov. Er setzt ein paar Filter, um die Unterschiede zwischen zwei Bildern zu erhalten und verwendet diese Bewegungen zu berechnen. Es ist wirklich schön gemacht und seine einfach in Ihrer eigenen Anwendung zu ändern und verwenden.

http://www.codeproject.com/KB/audio-video /Motion_Detection.aspx

Dies kann durch PInvoking die BitBlt API-Funktion durchgeführt werden. Hier ist ein Beispielcode:

http://www.codeproject.com/KB/GDI-plus /Bitblt_wrapper_class.aspx

Das Beispiel verwendet den SRCCOPY Rasteroperationscode; die Unterschiede zwischen den beiden Bitmaps zu erhalten, würden Sie stattdessen SRCPAINT oder etwas verwenden möchten (Google sollte die Liste der Codes geben).

GetPixel und SetPixel (auf der Bitmap-Klasse) ist unglaublich langsam. Mit LockBits wird viel schneller, aber Sie werden immer noch Ihren eigenen Code schreiben müssen.

Update: Dies ist eine bessere Verknüpfung:

http://www.pinvoke.net/default.aspx/gdi32.BitBlt

und enthält alle möglichen ternären Rasteroperationen (SRCPAINT oder SRCAND sind wahrscheinlich das, was Sie suchen.).

Zuerst definieren subtrahieren ;-P Was tun Sie die Antwort aussehen soll?

Die meisten Performance Art und Weise, dies zu tun wahrscheinlich LockBits ist - es sollte viel schneller als viele GetPixel Anrufe, aber Sie werden die Bytes selbst entschlüsseln müssen. Einfach, wenn es nur so etwas wie 32bpp ARGB, aber schwierig für einige komplexere Fälle ist.

Ich habe irgendwo gelesen, dass die verwendete Sprache in Adobe Pixel Bender ist inspiriert von etwas, das Microsoft einst taten. Kann mich nicht erinnern, wo ich es gelesen. Mein Denken ist, dass vielleicht, dass Microsoft „etwas“ in etwas eingewickelt wird, dass ein .NET-Projekt verwenden kann. Overkill für nur Subtraktion zweier Bilder, aber trotzdem.

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