Need Schneller Weg, um RGB-Wert für jedes Pixel eines gepufferten Bildes zu erhalten

7

Was ist der schnellste Weg, um den RGB-Wert jedes Pixels eines BufferedImage zu erhalten?

Im Moment bekomme ich die RGB-Werte mit zwei for -Schleifen, wie im folgenden Code gezeigt, aber es dauerte zu lange, um diese Werte zu erhalten, da die verschachtelte Schleife für mein Bild insgesamt 479999 Mal ausgeführt wird. Wenn ich ein 16-Bit-Bild verwende, wäre diese Zahl noch höher!

Ich brauche einen schnelleren Weg, um die Pixelwerte zu erhalten.

Hier ist der Code, mit dem ich gerade arbeite:

%Vor%     
Jony 10.04.2012, 12:06
quelle

5 Antworten

12

Ich weiß nicht, ob das helfen könnte und ich habe es noch nicht getestet, aber Sie können die rgb-Werte auf diese Weise erhalten:

%Vor%

Wie Sie sehen können, müssen Sie keine neue Farbe in der Schleife initialisieren. Ich invertierte auch die Breite / Höhe Schleifen wie von onemasse vorgeschlagen, um den Zähler aus Daten, die ich bereits habe, abzurufen.

    
mastaH 10.04.2012, 12:42
quelle
5

Durch den Wechsel von einer Menge einzelner getRGBs zu einem großen getRGB, um das gesamte Bild in ein Array zu kopieren, fiel die Ausführungszeit um eine Größenordnung von 33.000 Millisekunden auf 3.200 Millisekunden, während die Zeit das Array erzeugt war nur 31 Millisekunden.

Kein Zweifel, ein großer Lesevorgang in ein Array und eine direkte Indizierung des Arrays ist viel schneller als bei vielen einzelnen Lesevorgängen.

Die Leistungsdifferenz wird im Zusammenhang mit der Verwendung einer Haltepunktanweisung am Ende der Klasse angezeigt. Während sich der Haltepunkt außerhalb der Schleife befand, scheint jede Codezeile innerhalb der Klasse auf den Haltepunkt getestet zu sein. Das Wechseln zu individuellen Gets verbessert NICHT die Geschwindigkeit.

Da der Code immer noch korrekt ist, kann der Rest der Antwort immer noch nützlich sein.

Alte Leseanweisung

%Vor%

Leseanweisung, um ein Bit-Bild in ein Array zu kopieren

%Vor%

Der getRGB in ein Array setzt alle 3 Farbwerte in ein Arrayelement, so dass einzelne Farben durch Drehen und ein "und" extrahiert werden müssen. Die y-Koordinate muss mit der Breite des Bildes multipliziert werden.

Code zum Lesen einzelner Farben aus dem Array

%Vor%     
Fred F 28.11.2012 04:23
quelle
3

Sie sollten die Zeilen in der äußeren Schleife und die Spalten in der inneren Schleife wiederholen. Auf diese Weise vermeiden Sie Cache-Misses.

    
onemasse 10.04.2012 12:25
quelle
2

Haben Sie versucht, BufferedImage.getRGB (int, int, int, int, int [], int, int) ?

Etwas wie:

%Vor%

Habe es nicht versucht, also nicht sicher, ob es schneller ist.

Bearbeiten Den @ Code angeschaut, ist es wahrscheinlich nicht, aber einen Versuch wert.

    
soulcheck 10.04.2012 12:20
quelle
0

Ich habe hier eine Lösung gefunden Ссылка

%Vor%     
pipi 08.01.2018 14:03
quelle

Tags und Links