hi leute..
ein kommilitone und ich basteln seit einiger zeit an einer bildverarbeitungs-sw.
der aufbau is kurz erklärt: die bildquelle (cam/film/bild) ist ein BufferedImage, aus dem generieren wir uns ein eindimensionales int-array der länge width * height.
der ausgabethread holt sich jetzt das aktuelle bild als int-array, schickt es durch die filterkette, wandelt das resultierende int[] in ein BufferedImage um und zeichnet ggf. irgendwelche Overlays drauf.
in der paint() methode wird nun immer das image aufs frame gezeichnet.
beim optimieren dieses vorgangs is mir aufgefallen das die schnellste möglichkeit das int[] in ein BI zu bekommen ein instanziieren eines neuen objekts war ???:L
dieser versuch benötigt ~20ms um das bild zu zeichnen.
//EDIT: das ist die dauer in der die bilder letztendlich im Frame erscheinen
wie man weiss is das anlegen neuer objekte in zeitkritischen abschnitten nich unbedingt die beste vorgehensweise, also hab ich versucht nur die daten des BI zu überschreiben.
komischerweise benötigt das mit ~40ms etwa doppelt soviel zeit ???:L
andere versuche direkt im Buffer eines vorher instanziierten BI herum zu fummeln hatten irgendwie garkeinen effekt (schwarzes bild).
tja und direkt den puffer des quellbildes können wir leider auch nicht manipulieren da die filterkette die größe des bildes (und damit die länge des arrays) ändern könnte und ggf. auch mehrere ausgabethreads gleichzeitig laufen.
---
kennt jemand eine möglichkeit den vorgang zu beschleunigen (int[] --> BufferedImage) ??
mfg
ein kommilitone und ich basteln seit einiger zeit an einer bildverarbeitungs-sw.
der aufbau is kurz erklärt: die bildquelle (cam/film/bild) ist ein BufferedImage, aus dem generieren wir uns ein eindimensionales int-array der länge width * height.
der ausgabethread holt sich jetzt das aktuelle bild als int-array, schickt es durch die filterkette, wandelt das resultierende int[] in ein BufferedImage um und zeichnet ggf. irgendwelche Overlays drauf.
in der paint() methode wird nun immer das image aufs frame gezeichnet.
beim optimieren dieses vorgangs is mir aufgefallen das die schnellste möglichkeit das int[] in ein BI zu bekommen ein instanziieren eines neuen objekts war ???:L
Java:
public void draw(int[] picture) {
image = new BufferedImage(
dcm,
WritableRaster.createWritableRaster(sample, new DataBufferInt(picture, length), ZERO_POINT),
false,
null
);
// ....
repaint();
}
dieser versuch benötigt ~20ms um das bild zu zeichnen.
//EDIT: das ist die dauer in der die bilder letztendlich im Frame erscheinen
wie man weiss is das anlegen neuer objekte in zeitkritischen abschnitten nich unbedingt die beste vorgehensweise, also hab ich versucht nur die daten des BI zu überschreiben.
Java:
//...
image.setData(WritableRaster.createWritableRaster(sample, new DataBufferInt(picture, length), ZERO_POINT));
//...
komischerweise benötigt das mit ~40ms etwa doppelt soviel zeit ???:L
andere versuche direkt im Buffer eines vorher instanziierten BI herum zu fummeln hatten irgendwie garkeinen effekt (schwarzes bild).
tja und direkt den puffer des quellbildes können wir leider auch nicht manipulieren da die filterkette die größe des bildes (und damit die länge des arrays) ändern könnte und ggf. auch mehrere ausgabethreads gleichzeitig laufen.
---
kennt jemand eine möglichkeit den vorgang zu beschleunigen (int[] --> BufferedImage) ??
mfg
Zuletzt bearbeitet: