Sehr langsames Auslesen einzelner Pixel einer Bitmap?
-
Hallo miteinander,
ich habe folgende Funktion geschrieben die die Differenz zweier Bilder ausgeben soll. Nun habe ich das Problem, dass sie nahezu eine Sekunde für einen Durchlauf benötigt! Kann das sein? Ist das normal?? Wenn nicht, wo könnte der Fehler liegen?
Ich bin für jeden Tipp dankbar!
Viele Grüße
Micha
public Bitmap OwnGetBitMapDiff(Bitmap Image1, Bitmap Image2, int MinBrightnessDiff) { tmr.Start(); double TimerStart = tmr.startTime; double Duration; if (Image1.Width != Image2.Width || Image1.Height != Image2.Height) //Prüfen, ob Bilder gleicher Größe sind throw new ArgumentException("Keine Punkte!"); Bitmap Image3 = new Bitmap(Image1.Width,Image1.Height); int InputBrightness1, InputBrightness2, OutputBrightness; Color myColor; for (int y = 0; y < Image1.Height; y++) { for (int x = 0; x < Image1.Width; x++) { myColor = Image1.GetPixel(x, y); InputBrightness1 = (myColor.R + myColor.G + myColor.B) / 3; myColor = Image2.GetPixel(x, y); InputBrightness2 = (myColor.R + myColor.G + myColor.B) / 3; if (Math.Abs(InputBrightness1 - InputBrightness2) < MinBrightnessDiff) { myColor = Color.Black; } else { OutputBrightness = Math.Abs(InputBrightness2 - InputBrightness1); myColor = Color.FromArgb(OutputBrightness,OutputBrightness,OutputBrightness); } Image3.SetPixel(x,y,myColor); } } Duration = tmr.Durationall(TimerStart) * 1000; //Dauer von 940ms???? return Image3; }
-
Du könntest LockBits verwenden um direkten zugriff auf den Pixelpuffer zu bekommen.
-
David_pb schrieb:
Du könntest LockBits verwenden um direkten zugriff auf den Pixelpuffer zu bekommen.
Hallo David,
vielen Dank für den Tipp! Hab auch schon was im Inet dazu gefunden und lese mir das heute Abend mal in Ruhe durch...
Leider ist das nicht das einzige Problem...
Gruß
Micha
-
In dem MyCSharp-Forum gibt es einige gute Beiträge dazu:
http://www.mycsharp.de/wbb2/thread.php?threadid=59354
http://www.mycsharp.de/wbb2/thread.php?threadid=29667GetPixel und SetPixel sind sehr langsam für ein gesamtes Bild, da sie jeweils die x und y - Werte auf Gültigkeit überprüfen und SetPixel liest auch noch den alten Pixel-Wert vorher aus und gibt ihn zurück.
-
Th69 schrieb:
GetPixel und SetPixel sind sehr langsam für ein gesamtes Bild, da sie jeweils die x und y - Werte auf Gültigkeit überprüfen und SetPixel liest auch noch den alten Pixel-Wert vorher aus und gibt ihn zurück.
Afaik sind Get-/SetPixel Kernel-Funktionen, wo dann der SysCall der Flaschenhals sein dürfte.