BufferedImage bei paintComponent

TheMuh

Mitglied
Ich habe eine private Sub-Klasse erstellt, die ein Hintergrundbild schön anhand der von mir überschriebenen "paintComponent" Methode skaliert. Code zur Veranschaulichung anbei:
Java:
private class bgDrawing extends JPanel {
		private static final long serialVersionUID = 1L;
		@Override
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			int x = getContentPane().getWidth();
			int y = getContentPane().getHeight();
			bgScaled = bgOriginal.getScaledInstance(x,y, Image.SCALE_SMOOTH);
			if (bgScaled != null) {
				g.drawImage(bgScaled, 0, 0, this);
			}
		}
	}

Auf folgender Seite steht ganz unten das man die Performance steigern kann, indem man mit BufferedImage arbeitet.
Wie kann man in Java zeichnen? ? Informatik

Ich vermute mal, dass dies so ablaufen soll, dass man das Bild in der "paintComponent" immer nur in den BufferedImage zeichnet und nur einige wenige Bilder dann auf den contentPane weitergibt und so die Performance erhöht.
Meine Frage ist jetzt, wie erklärt man seinem Programm wann es etwas wirklich auf den contentPane zeichnet ?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
du malst sowieso nur ein Bild, da gibt es kein weiteres BufferedImage einzubauen im Gegensatz zum Link mit diversen Zeichenbefehlen,

was bei dir optimierbar wäre:
du erzeugst bei jedem paint-Vorgang ein neues kompliziertes skaliertes Image, dabei kann paint zig mal aufgerufen werden ohne dass sich die Größe ändert,
schlauer wäre es mit einem ComponentListener oder ähnlichem auf Änderungen des Fensters zu achten, nur dann ein neues Image zu berechnen und in paint() einfach nur das fertige Bild aus einem Instanzattribut zu malen, da macht es auch nix wenn öfter repainted wird
 

TheMuh

Mitglied
Vielen Dank!

Ich habe dem JApplet "ComponentListener" implementiert, der privaten JPanel Klasse "bgdrawing" einen Listener hinzugefügt und mache die Berechnung nun nur noch in den überschriebenen Listener-methoden.

Ich denke mal das hast du so gemeint ;)

P.S.: Hättest du mir trotzdem einen Link oder so zu einer verständlichen Einführung in BufferedImage, also insbesondere wann man sowas überhaupt nimmt und was dies genau macht ...
 

TheMuh

Mitglied
ah danke ....

bei dem Ansatz mittels ComponentListener habe ich nun das Problem das es im Browser zu Fehlern bei der Skalierung kommt.

Wenn ich nun in der Skalierungsmethode ein "repaint" des Hintergrundpanels einfüge funktionierts, meine letzte Frage ist dann aber nun noch, ob das für die Performance immer noch ok ist ?

hier ein Teil des Codes ...
Java:
private class bgDrawing extends JPanel {
		private static final long serialVersionUID = 1L;
		@Override
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			if (bgScaled != null) {
				g.drawImage(bgScaled, 0, 0, this);
			}
		}
	}

	@Override
	public void componentHidden(ComponentEvent arg0) {
		ScaleImage();
	}

	@Override
	public void componentMoved(ComponentEvent arg0) {
		ScaleImage();
	}

	@Override
	public void componentResized(ComponentEvent arg0) {
		ScaleImage();
	}

	@Override
	public void componentShown(ComponentEvent arg0) {
		ScaleImage();
	}
	
	private void ScaleImage() {
		int x = getContentPane().getWidth();
		int y = getContentPane().getHeight();
		bgScaled = bgOriginal.getScaledInstance(x,y, Image.SCALE_SMOOTH);
		super.repaint();
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ich weiß nicht genau was du machst, wurde vorher nicht auch schon bei Größenänderung gezeichnet?
wenn vorher ein geändertes Bild gezeichnet wurde und jetzt immer noch dann sollte sich in meinen Augen nicht viel getan haben,
die Verbesserung der Leistung wird erst bei NICHT-Größenänderung wirksam, weil dann nun nichts mehr berechnet wird,

natürlich kann man sich die ungünstigsten Szenarien denken, etwa das bei kontinuierlicher Größenänderung bisher nur 20x paint dran kam
(paint kommt evtl. nicht so oft, selbst wenn man mehrmals repaint anfordert wird nicht unbedingt auch immer gemalt),
der Listener dagegen genauer arbeitet und 100x drankommt -> nun 100 statt 20 Bildneuberechnungen,

das könnte man alles mit Logs genau klären, aufschreiben wann welche Methode mit welchem Zoom-Faktor drankommt,
am Ende alle Varianten vergleichen,
evtl. in ComponentListener selber einstellen dass nur dann ein neues Bild berechnet wird wenn mehr als x ms vergangen sind/ der Zoom um y% abweicht
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
I Arbeitsspeicherverbrauch BufferedImage.TYPE_INT_RGB vs. TYPE_3BYTE_BGR AWT, Swing, JavaFX & SWT 6
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
I GEmaltes BufferedImage löschen AWT, Swing, JavaFX & SWT 3
cool_brivk24 BufferedImage einem ClickEvent hinzufügen AWT, Swing, JavaFX & SWT 13
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
Zar von Domarus JFrame zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 3
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
G Subimage von BufferedImage speichern AWT, Swing, JavaFX & SWT 4
D JPanel Graphic2D als BufferedImage Speichern AWT, Swing, JavaFX & SWT 5
D BufferedImage -> Feature Extraktion. Unterschiedliche BufferedImage imageTypes problem AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Shape aus BufferedImage "löschen" AWT, Swing, JavaFX & SWT 2
M 2D-Grafik LookupOp Operation auf BufferedImage AWT, Swing, JavaFX & SWT 7
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
P BufferedImage schlechte Qualität beim Abspeichern AWT, Swing, JavaFX & SWT 9
S BufferedImage als schwarz-weiß-Bild AWT, Swing, JavaFX & SWT 3
Luk10 BufferedImage[...].getData() vs BufferedImage.setRGB() AWT, Swing, JavaFX & SWT 2
D Schnelles kopieren von Pixeln in ein BufferedImage AWT, Swing, JavaFX & SWT 25
J Flackern wie mit BufferedImage beheben AWT, Swing, JavaFX & SWT 4
N Swing BufferedImage neu laden AWT, Swing, JavaFX & SWT 10
N 2D-Grafik BufferedImage, Line2D, Swing und die Probleme AWT, Swing, JavaFX & SWT 5
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
P BufferedImage auf JPanel AWT, Swing, JavaFX & SWT 11
K 2D-Grafik BufferedImage eingelesen, welches Modell?! AWT, Swing, JavaFX & SWT 2
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
0x7F800000 2D-Grafik int[] zu BufferedImage konvertieren AWT, Swing, JavaFX & SWT 27
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
A BufferedImage nach dem Speichern immer schwarz AWT, Swing, JavaFX & SWT 8
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4
E BufferedImage Alphaknal ein- und ausblenden AWT, Swing, JavaFX & SWT 7
N BufferedImage zeichnen AWT, Swing, JavaFX & SWT 4
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
B 2D-Grafik BufferedImage Performance AWT, Swing, JavaFX & SWT 3
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
E AWT RenderedImage aus BufferedImage erzeugen, um Bild abzuspeichern? AWT, Swing, JavaFX & SWT 4
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik BufferedImage wird nicht eingezeichnet AWT, Swing, JavaFX & SWT 3
G 2D-Grafik BufferedImage Hintergrund immer schwarz AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
J AWT BufferedImage to 2DArray AWT, Swing, JavaFX & SWT 10
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
J JPanel in Bufferedimage AWT, Swing, JavaFX & SWT 3
1 BufferedImage in byte[], dann in String und zurück AWT, Swing, JavaFX & SWT 7
C BufferedImage-Fehler? Falsches Bild wir gezeichnet AWT, Swing, JavaFX & SWT 5
B BufferedImage Builder AWT, Swing, JavaFX & SWT 15
F Transparentes BufferedImage über BufferedImage AWT, Swing, JavaFX & SWT 12
F Größe von BufferedImage ändern AWT, Swing, JavaFX & SWT 27
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
2 Memory Leak mit BufferedImage !! AWT, Swing, JavaFX & SWT 15
X BufferedImage maximiert in JFrame anzeigen? AWT, Swing, JavaFX & SWT 2
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
R Zeichnen von Zahlen in BufferedImage AWT, Swing, JavaFX & SWT 6
G BufferedImage.getRGB() mit 3 int-Werten vergleichen AWT, Swing, JavaFX & SWT 2
Luma BufferedImage wird nicht gezeichnet AWT, Swing, JavaFX & SWT 3
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
S BufferedImage & Scaling: Altes Problem im neuen Gewand AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
G BufferedImage und jpg --> maximale Qualität AWT, Swing, JavaFX & SWT 9
F HTML Text irgendwie auf BufferedImage bringen AWT, Swing, JavaFX & SWT 3
R BufferedImage Problem AWT, Swing, JavaFX & SWT 2
G Problem mit BufferedImage und imageIO AWT, Swing, JavaFX & SWT 2
S BufferedImage drehen AWT, Swing, JavaFX & SWT 3
? ActionListener auf BufferedImage AWT, Swing, JavaFX & SWT 11
M BufferedImage mit html interpretierten String beschriften AWT, Swing, JavaFX & SWT 3
B Farbtiefe eines BufferedImage verringern AWT, Swing, JavaFX & SWT 3
F ImageIcon -> BufferedImage AWT, Swing, JavaFX & SWT 2
T Performance Problem bei BufferedImage AWT, Swing, JavaFX & SWT 3
F Animiertes Gif als BufferedImage AWT, Swing, JavaFX & SWT 10
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
C Rotate BufferedImage --> Bild unvollständig AWT, Swing, JavaFX & SWT 5
U Streifen hinter bewegtem BufferedImage AWT, Swing, JavaFX & SWT 13
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
T BufferedImage verkleinern Resultat ist zu pixelig. AWT, Swing, JavaFX & SWT 6
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
B BufferedImage aus einer Datei AWT, Swing, JavaFX & SWT 4
C Farben in BufferedImage ändern ? AWT, Swing, JavaFX & SWT 2
J Image to BufferedImage AWT, Swing, JavaFX & SWT 5
T BufferedImage kopieren AWT, Swing, JavaFX & SWT 3
T BufferedImage Farbe "Transparent" AWT, Swing, JavaFX & SWT 21
T BufferedImage + bestimmten bereich ausfüllen AWT, Swing, JavaFX & SWT 3
M BufferedImage Größe? AWT, Swing, JavaFX & SWT 10
U Löschen eines BufferedImage AWT, Swing, JavaFX & SWT 7
J Image aus BufferedImage ohne AWT AWT, Swing, JavaFX & SWT 5
V Image in BufferedImage AWT, Swing, JavaFX & SWT 3
J BufferedImage aus byte-Array erstellen AWT, Swing, JavaFX & SWT 3
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben