Vorhandenes Graphicsobjekt auf Componente zeichnen

Status
Nicht offen für weitere Antworten.

BlackCraze

Mitglied
Hallo an alle :)

Meine Frage:

Es ist mir bekannt, dass ich mit der paint()-Methode einer JComponent auf irgendein Graphics-Objekt zeichen kann. Was ist aber, wenn ich ein schon fertiges Graphics-Objekt habe und dessen Inhalt sozusagen auf die JComponent (oder Panel oder was weiß ich - das ist nicht so wichtig) malen möchte? ???:L

Ich zerbrech mir schon ne ganze Weile den Kopf darüber und mir will einfach keine Lösung einfallen. Entweder ich steh total aufm Schlauch, oder ich weiß auch nicht ^^

Noch fürs Verständnis:

Graphics pagedGraphic = component.getGraphics().create(0, 612, 612, 953); //component ist eine JComponent
/*
* und jetzt sowas wie:
* pagedGraphic.paint(mySecondComponent);
* nur, dass Graphics natürlich keine paintmethode hat
* wollte nur verdeutlichen, was ich möchte ;)
*/

Danke
Der Craze
 

Wildcard

Top Contributor
Der Fehler fängt schon bei getGraphics an. Diese Methode solltest du niemals(zumindest solange du nicht weißt warum man es nicht macht) aufrufen.
Wenn du das nicht getan hättest, wäre deine Frage also gar nicht aufgekommen :wink:
 

BlackCraze

Mitglied
Tut mir leid, ich kann aus deinem Post keine Lösung für mich finden. Warum sollte ich das grapficsObjekt nicht abrufen dürfen?
 

Wildcard

Top Contributor
Weil sowohl in Swing als auch in AWT passiv gezeichnet wird.
Du klaust dir nicht einfach ein dahergelaufenes Graphics Objekt und schmierst darauf rum, sondern du überschreibst paintComponent (bzw. paint) und wartest schön artig in der Ecke bis AWT dir ein Graphics Objekt gibt. Dann zeichnest du.
 

Wildcard

Top Contributor
Versuch mal das gewünschte Ergebnis genauer zu beschreiben. Ich bin nicht sicher was du machen willst.
 

BlackCraze

Mitglied
ich habe eine riesige Componente, in die eine Grafik gezeichnet wurde. Diese Grafik soll als Bilddatei gespeichert werden. Leider geht es nicht, dass ich einfach ein Bild mit den ausmaßen dieser Componente erzeuge, da der Speicher dafür nicht ausreicht. Nun wollte ich einzelne Ausschnitte dieser großen Componente einzeln speichern. So dass ich sie danach evtl als PDF zusammenfügen könnte. Also ein Bildausschnitt pro Blatt oder so.

Alternativ hatte ich auch überlegt die daten als bytestrom direkt an das ende der Bilddatei zu schreiben. Allerdings könnte ich es da nur unkomprimiert machen - was ziemlich viel speicher fressen wird, und außerdem muss man das Bild ja auch irgendwie wieder anzeigen können ^^. Deswegen wäre mir diese ausschnittsache lieber.
 

Wildcard

Top Contributor
Ok, versuch's mal so:
Erzeug dir ein BufferedImage und ruf darauf createGraphics auf (bei Images darf man das :wink: )
dann rufst du auf dem Graphics Objekt setClip auf um einen Bereich festzulegen.
Anschließend die Komponente in das Graphicsobjekt zeichnen lassen.
Neuen Clip festlegen, wieder zeichnen lassen, usw.
 

BlackCraze

Mitglied
hatte ich schon getestet.
Das Problem dabei ist, dass mir java bereits beim Anlegen des BufferedImages schon sagt, dass der Speicher nicht reicht. Denn das Objekt des BufferedImages muss ja auch in den Speicher.
 

Wildcard

Top Contributor
Das Image muss natürlich kleiner sein als die Komponente.
Wozu denn sonst der ganze Umstand mit dem Clip? :?
 

BlackCraze

Mitglied
Funktioniert leider nicht. Damit kann ich immer nur das erste Bild erstellen. Wenn ich den Clip auf das kleine "bild" anwende, malt er mir ja trotzdem das obere normale bild hinein, nur mit ner schwarzen Ecke oben drin.

Wende ich den Clip auf das große bild an - also auf die Componente - Ist das der Gleiche effekt, da der sichtbare Bildausschnitt trotzdem noch dort positioniert ist, wo er ursprünglich war. Lasse ich jetzt die Componente auf das Graphics-object painten, habe ich wieder diese ecke :-/

zur sicherheit, dass wir das gleiche meinen:

Code:
BufferedImage img = new BufferedImage(953,612,BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

g2d.setClip(0,300,953,612); //oder halt component.setClip...

component.paint(g2d);
wenn ich diesen Bildausschntt jetzt noch in die Obere Linke ecke positionieren könnte ohne das bild in der componente dauerhaft zu schädigen, würde es gehen. Den Clip brauche ich dann ja auch nicht mehr.
 

Wildcard

Top Contributor
Ich dachte du willst das Bild schritt für Schritt rauskopieren? ???:L
Ich hatte das so gedacht das du einen Teil rauskopierst, speicherst, clip verschiebst, speicherst, usw.

Übrigens:
Ich hab spaßeshalber mal überschlagen wieviel Pixel die VM theoretisch im Speicher halten kann.
Wenn ich mich nicht blöd verrechnet habe sollten 9.000.000.000 Pixel drin sein ~30.000x30.000 :shock:
 

BlackCraze

Mitglied
das tue ich ja auch - die fixen zaheln habe ich nur geschrieben, damit ich nicht beim testen immer das ganze bild berechnen muss. das dauert ja ewig ^^

Edit:
der Clip ist ja nur wie eine "Maske", die über die gesamtgrafik gelegt wird. es wird in das kleine Bild mit

component.paint(g2d);

ja immer nur der oberste linke teil landen. wenn der bildauschnitt daneben aber geclipt wird, ist das gespeierte Bild schwarz. Da über diesem Teil die Maske liegt.

und ja - es ist nunmal so groß ^^ - das momentane zwar nicht ("nur" 1580x67850), aber es kann durchaus so groß werden!
 

Wildcard

Top Contributor
damn :shock:

Das Problem versteh ich jetzt aber immer noch nicht. Was tut an der clip Lösung nicht das was du willst?
 

BlackCraze

Mitglied
teilspeicherung.JPG


ich habs mal aufgemalt.
beim erstenmal klappt es noch. Danach ist jedes Bild schwarz. Ich müsste den zu speichernden bereich auch noch verschieben. Aber das, ohne das Bild kaputt zu machen :)
 

Wildcard

Top Contributor
ok ok, sehe das Problem.
Versuch mal das Graphics vom BufferedImage bzw der Komponente auf Graphics2D zu casten und dann mit translate den Ursprungspunkt zu ändern.
 

BlackCraze

Mitglied
Jetzt dachte ich so bei mir *NATÜRLICH!!!* So muss es einfach klappen. Doch leider macht

Code:
BufferedImage img = new BufferedImage(953,612,BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
component.getGraphics().setClip(0,300,953,612);
component.getGraphics().translate(0, 300);
component.paint(g2d);

das gleiche Bild wie

Code:
BufferedImage img = new BufferedImage(953,612,BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
component.getGraphics().setClip(0,300,953,612);
//component.getGraphics().translate(0, 300);
component.paint(g2d);

und auch mit Casten gehts net. Das habe ich auch probiert:

((Graphics2D)component.getGraphics()).translate(0, 300);
((Graphics2D)component.getGraphics()).setClip(0,300,953,612);

habe auch den Clip und das translate mal getauscht. So als verzweiflungsakt ^^ - bringt auch nix
 

BlackCraze

Mitglied
hi ... es funktioniert

ich weiß zwar nicht warum, aber wenn man mit translate() den Koordinatenursprung Graphics-Objektes ins negative verschiebt, funktioniert es.

Code:
BufferedImage img = new BufferedImage(953,612,BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();		
g2d.translate(0, -300);
g2d.setClip(0,300,953,612);
component.paint(g2d);

Die Zahlenwerte sind natürlich nur Beispielhaft :)

Was man außerdem beachten sollte:
Wenn man mit Java5 arbeitet, bekommt man durch den FileSave-Dialog unter Umständen einen grauen "Kasten" auf das Bild. Das passiert meiner Meinung nach, weil der Dialog erst nach der Dateispeicherung geschlossen wird. Im Java6 habe ich das Problem allerdings nicht.

danke für die Hilfe :)
so long

Craze
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JPopupMenu - Ein vorhandenes Kontextmenü erweitern AWT, Swing, JavaFX & SWT 6
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Graphics2D Componente Drehen AWT, Swing, JavaFX & SWT 2
C Componente in Container (inkl. "Untercontainer") suchen und zurückgeben AWT, Swing, JavaFX & SWT 3
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
P Swing Componente über Rahmen hinaus zeichnen AWT, Swing, JavaFX & SWT 2
M Swing Image in JPanel als Componente AWT, Swing, JavaFX & SWT 2
J Swing JPanel mit Hintergrund zeigt componente nicht AWT, Swing, JavaFX & SWT 6
H Feststellen ob eine Componente sichtbar (im Vordergund) ist? AWT, Swing, JavaFX & SWT 2
J Name von einer Componente AWT, Swing, JavaFX & SWT 3
K Listeners und das Ende einer Componente AWT, Swing, JavaFX & SWT 4
G SWT SWT Componente gesucht AWT, Swing, JavaFX & SWT 2
L Größe einer Componente herausfinden AWT, Swing, JavaFX & SWT 2
R Position einer Componente? AWT, Swing, JavaFX & SWT 9
G Componente Zeile fixieren AWT, Swing, JavaFX & SWT 3
S Funktion nur ausführen, wenn Maus über Componente ist AWT, Swing, JavaFX & SWT 2
S Componente mehrmals verwenden ? AWT, Swing, JavaFX & SWT 3
P Hinzugefügte Componente ist inaktiv AWT, Swing, JavaFX & SWT 14
ARadauer swing html wysiwyg componente AWT, Swing, JavaFX & SWT 6
S Listener übergeordneter Componente Blockiert AWT, Swing, JavaFX & SWT 6
E JFrame Componente aus einer anderen klasse disposen AWT, Swing, JavaFX & SWT 3
G Farbe der Markierung einer Componente ändern AWT, Swing, JavaFX & SWT 2
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
S [S] custom tree componente AWT, Swing, JavaFX & SWT 8
B componente drucken AWT, Swing, JavaFX & SWT 3
C Componente verkleinern lasse wenn die Frame verkleinert wird AWT, Swing, JavaFX & SWT 2
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
K property panel und selektion einer componente in panel AWT, Swing, JavaFX & SWT 5
R Componente in JTabbedPane unsichtbar AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben