Probelme mit großen BufferedImage in paintComponent

Status
Nicht offen für weitere Antworten.

Alu

Mitglied
Grüße!
In meiner Swing-Applikation zeichne ich erst in ein BufferedImage, dieses dann in ein JPanel.

Sofern sich die Größe des JPanels nicht ändert, wird bei jedem update ( bzw. ich rufe bei Bedarf repaint() auf ) das BufferedImage gezeichnet. (Damit spare ich Zeit, da ich ne Menge Linien zeichne, nur bei einem resize wird das BufferedImage neu gefüllt )

Funktioniert alles wie es soll, aber: ab einer bestimmten Größe bzw. wenn das BufferedImage sehr groß wird, ist die Darstellung nich mehr korrekt!! Ich bekomme keine OutOfMemoryException bzw. irgendeine andere Exception!

Gibt es da irgendwelche Beschränkungen bei BufferedImage? Vielleicht sollte ich noch darauf hinweisen, dass mein JPanel einem Scrollpane zugeordnet wurde ( jScrollPane.setViewPort( myPanel ) )

Hier ein Codeausschnitt:

Code:
public void paintComponent(Graphics g)
{
    ...

    Graphics2D g2 = (Graphics2D) g;
    Dimension d = this.getSize();
    Graphics2D g2image = g2; 

    ...

     if ( m_graphImage == null || !(d.equals( m_imageDimension )) )
    {
      m_imageDimension = new Dimension();
      m_imageDimension.setSize(d);

      Image myImage = this.createImage( d.width, d.height );

      if ( myImage instanceof BufferedImage )
      {
        m_graphImage = (BufferedImage)myImage;
        g2image = m_graphImage.createGraphics();
      }
   
     g2image.draw( new Line2D.Double( x_old, y_old, x_new, y_new) );  

    ....
    
    g2.drawImage(m_graphImage, null,0,0);
    
    ...
    
}
 

Alu

Mitglied
Also ich skaliere meine Grafik indem ich einen Slider verwende.
Da passiert noch nichts bzw. im Viewport wird alles korrekt angezeigt bzw. wie gewünscht.
Wenn ich dann scrolle, ist die Grafik auf einmal leer oder es werden kurze Bereiche der Grafik angezeigt ... witzigerweise erst ab einer bestimmten Größe (ich werd morgen nochmal genau untersuchen, ab wann das genau ist)
Wenn ich den Slider wieder zurück bewege, wird dann ab einer bestimmten Größe auch alles wieder korrekt angezeigt! Wenn ich das BuffereImage rausnehme tritt da Problem überhaupt nicht auf!! Nur das Zeichnen dauert dann sehr lange, was ich nicht will.

Murray hat gesagt.:
Wie äußert sich das Problem? Bei welcher Größe tritt es auf?
 

Wildcard

Top Contributor
Die Frage ist auch warum das Zeichnen ohne Image lange dauert. Von welcher Größenordnung Linien reden wir, und wieviele davon sind gleichzeitig sichtbar? Musst du zum zeichnen noch etwas berechnen, oder ist alles ready to use?
 

Alu

Mitglied
Ich zeichne einen Audiograph. Und habe zur Zeit bis zu 5000 Koordinaten eingestellt ... Das habe ich gemacht damit ich skalieren kann (vergrößern bis zur einer gewissen Auflösung) ohne Daten vom Audiofile neu nachzuladen zu müssen.

Berechnen muss ich nur bei Größenänderung des Panels (also wenn sich this.getSize() ändert ) . Siehe unten.

Ich stimme dir schon zu , dass hier sicher Optimierungsmöglichkeiten sind. Aber mit dem BufferedImage geht das zeichnen rasend schnell!!!! Ich erlaube auch Selektion der Grafik usw. , d.h. bei MouseDrag wird der selektiere Bereich invertiert usw (ich kopiere da nur die Bitmap mit dem Grafen und zeichne per xor verknüpfung die selektion). ... und wenn ich da jedesmal den Grafen neu zeichen muss wie unten !? ..

Hier meine "langsamen" Operationen ( ich werde das morgen optimieren. U.a mit dem Vector und der Hashmap;). Aber das wird nie so schnell werden wie mit dem Buffered Image - das weiß ich jetzt schon! )

Und danke euch für die Hilfsbereitschaft!!

Code:
      for(int i=1; i<m_lineVector.size(); i++)
      {
          x_old = x_new;
          y_old = y_new;

          x_stored = m_lineVector.elementAt(i);
          y_stored = m_lineHash.get( x_stored );

           x_new = (double)x_stored/(maxRes.getWidth()-1.0d ) * (d.getWidth()-1.0d);
          y_new = d.getHeight()-1.0d - y_stored * (d.getHeight()-1.0d);       

          // todo: clipping evtl beim kanal mischen oben
          
          g2image.draw( new Line2D.Double( x_old, y_old, x_new, y_new) ); 
      }


Wildcard hat gesagt.:
Die Frage ist auch warum das Zeichnen ohne Image lange dauert. Von welcher Größenordnung Linien reden wir, und wieviele davon sind gleichzeitig sichtbar? Musst du zum zeichnen noch etwas berechnen, oder ist alles ready to use?
 

Alu

Mitglied
Bingo!!
Die Option

Code:
java -Dsun.java2d.noddraw=true -jar "meinProg.jar"

schaltet die Verwendung von DirectDraw und Direct 3D aus (bzgl Java2D). Dann läuft alles wie geschmiert!!
Super brummfondel!! Was mich jedoch jetzt stört ist wieder die Systemabhängigkeit bzw. das man von "außen" wieder was einstellen muss! ... naja, jedenfalls hat dein Tipp mir eine Menge Sucherei erspart - da ich dachte, dass ich evtl nicht ganz sauber in paintComponent() arbeite ....!!


brummfondel hat gesagt.:
Das klingt, als würden da einige der Mal-Operationen vom falschen Chip erledigt, also entweder von der CPU im Grafikspeicher oder es wird von der CPU zuviel hin und her kopiert.

Versuch mal einige der Optionen von dort: http://java.sun.com/j2se/1.5.0/docs/guide/2d/flags.html
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JavaFX Gridpane mit gleich großen Spalten AWT, Swing, JavaFX & SWT 23
E JavaFX Sehr viel und unterschiedlich Großen Inhalt auf einer "Fläche" ... Umsetzbar ? AWT, Swing, JavaFX & SWT 3
S Bilddatei kopieren, aber ohne verluste und ohne zu großen Speicherverbrauch AWT, Swing, JavaFX & SWT 17
G JList mit einer großen Anzahl an Einträgen AWT, Swing, JavaFX & SWT 15
S Buttons mit großen Icon AWT, Swing, JavaFX & SWT 7
R Kleine Panels auf einem großen Panel frei platzieren AWT, Swing, JavaFX & SWT 11
H MouseMotionListener#mouseDragged() in großen Abständen AWT, Swing, JavaFX & SWT 7
S GridLayout mit sehr großen Abständen AWT, Swing, JavaFX & SWT 3
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
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
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
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
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
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
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

Ähnliche Java Themen

Neue Themen


Oben