Swing Skalieren mit DrawImage macht Linien kaputt

P@u1

Aktives Mitglied
Hallo zusammen,

habe mal wieder ein Swing-Problem:
Ich habe ein Bild, dass aus vielen Linien besteht in ein BufferedImage gemalt, nun will ich es je nach aktueller Größe des Fensters richtig skaliert zeichnen.
Das Problem ist:
Linien, die zuvor mit DrawLine gemalt wurden werden zerstückelt, also haben auf einmal Lücken, so ungefähr:

vorher: --------------------------------- (wir nehmen jetzt an, dass die Striche direkt verbunden sind)
nachher: --- --- --- --- --- --- --- (die Lücken sind eigentlich nicht ganz regelmäßig verteilt)

Und ich bin mir 99% sicher, dass es am skalieren liegt, ich hab testweise einfach mal eine einzelne Linie gezeichnet von (0,0) zu (1000,1000) und dort trat der gleiche effekt auf.
Benutze ich die DrawImage funktion ohne angabe der größe, so wird nicht skaliert und der Effekt tritt nicht auf.
Was kann ich da jetzt machen?
Das mit dem skalieren ist mir schon wichtig und das manuell zu machen ist vermutlich aufwändig und langsam.
Irgendwelche Ideen?

Vielen Dank schonmal für Antworten
 

Runtime

Top Contributor
Wenn du die Linien schön haben willst, wirst es nochmal neu zeichnen müssen, aber wenn es unbedingt so sein muss könntest du den Effekt verringern, indem du eine Liste mit verschieden grossen BufferedImages hast und immer das zeichnest, welches der Grösse des Fensters am nächsten kommt.
 

P@u1

Aktives Mitglied
hmmm, alles nicht so prickelnd.
Ich überlege jetzt folgendes:
Ich speicher mir alle Linien als Objekte in einer Liste ab, dann benutze ich einen componentResizedListener, der sobald sich die Größe des ZielPanels ändert ein neues bufferedimage erzeugt, auf den die sachen mit neuer skalierung gezeichnet werden.
Ich will später auch nur die y-Achse skalieren, von der x-Achse nehme ich dann immer nur einen so großen Ausschnitt, wie aufs Bild passt.

Problem ist nur, dass componentResized während man die größe verändert extrem oft ausgeführt wird, ich bräuchte was, was am besten erst aufgerufen wird, wenn das verändern der größe abgeschlossen ist.
Evtl. nen Timer, der beim aufruf von componentresized gestartet wird und bei jedem weiteren aufruf zurückgesetzt wird?

Hast du vll noch gute Ideen, die mir helfen könnten?
 

Guybrush Threepwood

Top Contributor
Welche Einstellungen zum Antialiasing hast Du verwendet? Wende mal den folgenden Code auf Dein Graphics-Objekt an:
Java:
Graphics2D g2d = ...;
		g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Das kostet mehr Rechenleistung, bringt aber bessere Ergebnisse beimn Skalieren.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das problem, das du beschreibst, ist vermutlich das, was man als "aliasing" bezeichnet. Wenn man eine Linie malt
Code:
X
 X
  X
   X 
    X
     X
      X
und diese Bild dann um die Hälfte niedriger macht, fällt (im einfachsten Fall) jeder zweite Pixel weg
Code:
X
 X
   X
     X

Man kann dem Teilweise entgegen wirken, indem man beim Zeichnen entweder Antialiasing im Graphics2D einschaltet, oder andere RenderingHints passend setzt (schau mal in derf Nähe von dem hier). Wie genau man das am besten einstellt, hängt auch davon ab, wie es jetzt gezeichnet wird, und ggf. müßte ich auch erst ein bißchen rumprobieren... Und wie gut die Ergebnisse (besonders bei starken Größenänderungen) im Vergleich zum Neuzeichnen sind, bleibt auch erstmal offen...

EDIT: Ein bißchen langsam :oops:
 

P@u1

Aktives Mitglied
Welche Einstellungen zum Antialiasing hast Du verwendet? Wende mal den folgenden Code auf Dein Graphics-Objekt an:
Java:
Graphics2D g2d = ...;
		g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

Das kostet mehr Rechenleistung, bringt aber bessere Ergebnisse beimn Skalieren.

Danke, die Linie bleibt jetzt erhalten, nur leider wird sie dadurch etwas dicker, was eigentlich nicht gewünscht ist und wirkt aus einzelteilen zusammengesetzt.
Wenn ihr noch tipps habt, was ich noch ändern kann, probier ichs mal aus, ansonsten werde ich vermutlich die die zweite variante versuchen.

Edit: Ich hatte nur bei der einen Linie getestet, da wird es wirklcih besser, aber dann hab ich nochmal ein anwendungsnäheres Beispiel benutzt, ein Sinus der aus vielen kleinen Linien zusammengestzt ist und auch mit den Einstellungen tritt der Effekt ein, dass die Linien "zerstückelt" werden.
Ich denke mal, es wäre dann doch besser den anderen Weg zu gehen über diese Objektliste und aktualisieren bei Größenänderung.
Nur muss ich noch gucken, wie genau ich das dann mache.

Wenn ich die Größe des Fensters durch ziehen der Maus verändere, wird normalerweise (bei kurzem code) das ComponentResizeEvent sehr sehr oft ausgelöst.
Wie funktioniert das wenn ich einen componentResizeListener verwende und in dem code davon lange berechnungen mache?
Wird das dann auch ganz oft aufgerufen und die folgenden Aufrufe müssen "warten" und werden angehängt, oder werden die folgenden Aufrufe einfach ignoriert, oder wie funktioniert das?

Das Problem ist ja, dass ich bei diesem Event das ganze BufferedImage neumachen will, was vermutlich relativ lange dauert und falls bei einem resizevorgang das dann tausen mal aufgerufen wird und die aufrufe hintereinander alle abgearbeitet werden würden, dann würde das sehr lange dauern.
Würden aber die Aufrufe die kommen während die Methode läuft nicht mehr ausgeführt werden, wäre das auich schlecht, weil dann ein neues Image erzeugt wird, währenddessen sich die größe weiter verändert, aber dann das Image auf falscher Größe bleibt.
 
Zuletzt bearbeitet:

Guybrush Threepwood

Top Contributor
Im Grunde erhält man immer bessere Ergebnisse, wenn völlig neu gezeichnet und nicht skaliert wird. Dabei wirst Du wahrscheinlich meistens einen Qualitätsverlust erleiden. Ob das Neuzeichnen zu langsam ist hängt vermutlich von der Größe des Bildes und der Menge an Objekten ab. Wenn Du mit Java2D zeichnest, dann geht es aber meist sehr sehr schnell. Das Problem ist eher das hantieren mit Bitmaps etc. Wenn Du verhindern möchtest, dass beim Größerziehen ständig neu gezeichnet wird, dann könntest Du z. B. über das Setzen einer boolean-Variable in der Zeichen-Routine festhalten, ob noch eine Verarbeitung im Gange ist. In der PaintComponent-Methode wäre es dann möglich, dies abzufragen und ein Neuzeichnen zu verhindern, falls gerade noch eine alte Zeichnung vorbereitet wird, oder so ähnlich. Alternativ könnte auch bei einem ComponentResizeEvent eine bereits in Arbeit befindliche Neuzeichnung unterbrochen werden. Es gibt da sicher viele Möglichkeiten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
U Was genau ist skalieren bei 2dGraphics? AWT, Swing, JavaFX & SWT 4
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
E Bilder skalieren AWT, Swing, JavaFX & SWT 4
B Swing JTextField mit Bildschirmauflösung skalieren lassen. AWT, Swing, JavaFX & SWT 4
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
S JViewPort Ausschnitt skalieren AWT, Swing, JavaFX & SWT 13
A Bild in JLabel skalieren AWT, Swing, JavaFX & SWT 4
L 2D-Grafik Avatar skalieren und zuschneiden. AWT, Swing, JavaFX & SWT 9
S Bild skalieren AWT, Swing, JavaFX & SWT 3
C LayoutManager Grafik soll nicht im GridLayout Skalieren AWT, Swing, JavaFX & SWT 3
A JFrame skalieren AWT, Swing, JavaFX & SWT 2
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
P Swing Bild an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 11
S AWT Skalieren von Polygon über Area klappt nicht AWT, Swing, JavaFX & SWT 4
N 2D-Grafik Panelgrafik im nachhinein skalieren AWT, Swing, JavaFX & SWT 4
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
B Fenstergröße automatisch skalieren AWT, Swing, JavaFX & SWT 7
B Bild skalieren AWT, Swing, JavaFX & SWT 2
N JFreeChart: Plot soll mit skalieren AWT, Swing, JavaFX & SWT 5
Q 2D-Grafik Shape skalieren AWT, Swing, JavaFX & SWT 5
D BufferedImage Größe skalieren AWT, Swing, JavaFX & SWT 2
C Image performant skalieren AWT, Swing, JavaFX & SWT 5
R Bild drehen UND skalieren (Image bzw BufferedImage) AWT, Swing, JavaFX & SWT 5
DStrohma Bild für TrayIcon skalieren AWT, Swing, JavaFX & SWT 13
N Panel skalieren AWT, Swing, JavaFX & SWT 7
N Swing sehr großes Bild skalieren AWT, Swing, JavaFX & SWT 8
D image skalieren AWT, Swing, JavaFX & SWT 5
K JPanel proportional skalieren AWT, Swing, JavaFX & SWT 7
P [SWT] Background-Image skalieren statt kacheln AWT, Swing, JavaFX & SWT 2
R Bild skalieren und anschließend beschneiden AWT, Swing, JavaFX & SWT 3
J Fixes Layout auf beliebige Fenstergröße skalieren AWT, Swing, JavaFX & SWT 2
I Layout Problem beim Skalieren AWT, Swing, JavaFX & SWT 3
M Schlechte Qualität beim skalieren von Bildern AWT, Swing, JavaFX & SWT 10
S Bild skalieren AWT, Swing, JavaFX & SWT 9
B Bild Skalieren AWT, Swing, JavaFX & SWT 2
I Bild skalieren AWT, Swing, JavaFX & SWT 4
O JFrame JPanelgrösse fixieren Bild darin skalieren AWT, Swing, JavaFX & SWT 2
M BufferedImage skalieren AWT, Swing, JavaFX & SWT 6
S Drucken - Bild skalieren AWT, Swing, JavaFX & SWT 2
I Bilder skalieren => OutOfMemoryError AWT, Swing, JavaFX & SWT 2
M Bild skalieren AWT, Swing, JavaFX & SWT 8
S AWT Frame-Inhalt in Echtzeit skalieren AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
J drawImage Fehlersuche AWT, Swing, JavaFX & SWT 5
U drawImage mit EPS AWT, Swing, JavaFX & SWT 0
A Problem mit drawImage AWT, Swing, JavaFX & SWT 1
M Graphics.drawImage von unten nach oben abbilden lassen AWT, Swing, JavaFX & SWT 6
P 2D-Grafik g2.drawImage() langsam AWT, Swing, JavaFX & SWT 110
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
G .ico drawImage AWT, Swing, JavaFX & SWT 5
B drawImage funktioniert nicht AWT, Swing, JavaFX & SWT 4
B drawImage auf JPanel bleibt ohne Auswirkungen AWT, Swing, JavaFX & SWT 9
K Graphics.drawImage() sehr schnell AWT, Swing, JavaFX & SWT 5
M Graphics.drawImage verlangsamt sich plötzlich AWT, Swing, JavaFX & SWT 15
0 AWT Graphics2D.drawImage() funktioniert nicht mehr korrekt mit Core i7 AWT, Swing, JavaFX & SWT 4
G Graphics.drawImage() AWT, Swing, JavaFX & SWT 6
? Problem mit drawImage: bei Frame ok, bei JPanel nicht AWT, Swing, JavaFX & SWT 4
F Problem mit drawImage() AWT, Swing, JavaFX & SWT 6
M drawImage bremst GUI AWT, Swing, JavaFX & SWT 2
I drawImage AWT, Swing, JavaFX & SWT 4
B drawImage() hängt! AWT, Swing, JavaFX & SWT 18
O performance g2d.drawImage() AWT, Swing, JavaFX & SWT 17
L Bildbewegung mit g.drawImage AWT, Swing, JavaFX & SWT 3
K g.DrawImage unter paintComponent klappt nur beim 1. Aufruf AWT, Swing, JavaFX & SWT 3
S kurze Frage zu drawImage AWT, Swing, JavaFX & SWT 12
F Endlosschleife bei drawImage() AWT, Swing, JavaFX & SWT 4
L Gezeichnetes Image mit DrawImage überzeichnen AWT, Swing, JavaFX & SWT 3
M drawImage mit seltsamen verhalten AWT, Swing, JavaFX & SWT 2
H GridBagLayout macht mich wahnsinnig :-( AWT, Swing, JavaFX & SWT 5
melaniemueller Was macht e.getSource() ? AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
ruutaiokwu Swing windowStateChanged macht exakt das Gegenteil beim Verändern der Fenstergrösse AWT, Swing, JavaFX & SWT 3
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
Furtano AWT GridBagLayout macht mir Sorgen AWT, Swing, JavaFX & SWT 3
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
T JLabel macht sich selbstständig? o.0 AWT, Swing, JavaFX & SWT 2
L LayoutManager macht nichts AWT, Swing, JavaFX & SWT 19
S Swing Swing macht sehr seltsame Zeichnungen. AWT, Swing, JavaFX & SWT 13
danx066 MouseListener macht was er will AWT, Swing, JavaFX & SWT 14
G Swing Button ActionListener macht komische Sachen AWT, Swing, JavaFX & SWT 19
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
R wie macht am besten ein GUI ? AWT, Swing, JavaFX & SWT 21
hdi Swing JFrame#setCursor macht Zicken AWT, Swing, JavaFX & SWT 10
L Swing JButton macht Eventhandling kaputt AWT, Swing, JavaFX & SWT 3
D GridBagLayout macht nicht das was es soll AWT, Swing, JavaFX & SWT 12
J Swing Formulare in Swing - wie macht ihr das? AWT, Swing, JavaFX & SWT 7
T JTable / RowSorter macht große Probleme AWT, Swing, JavaFX & SWT 2
V Swing Mein swingender Pokertisch macht Probleme AWT, Swing, JavaFX & SWT 10
G Bildervorschau macht Probleme AWT, Swing, JavaFX & SWT 22
N SWT Text pack() macht Text zu klein AWT, Swing, JavaFX & SWT 2
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben