Graphics2D rotieren und rotiertes Bild abspeichern

Status
Nicht offen für weitere Antworten.

redztripe

Mitglied
Hallo zusammen,
ich möchte mit Graphics2D ein Bild rotieren (was auch klappt) und das rotierte Bild auf meiner
Platte abspeichern. Die Datei hat zwar die richtigen Maße, jedoch wird nur ein schwarzes Bild angezeigt.
Kann mir das jemand erklären bzw. sagen was ich falsch mache?
hier mein code....
Code:
 public void paint(Graphics g) {
      super.paint(g);
      Graphics2D g2 = (Graphics2D) g;
      int cx = getWidth() / 2;
      int cy = getHeight() / 2;
      
      int imageWidth = img.getWidth(this);
      int imageHeight = img.getHeight(this);      
      
      int x = -imageWidth / 2;
      int y = -imageHeight / 2;
      g2.translate(cx, cy);
      g2.rotate(rad);
      g2.drawImage(img, x, y, this);     
      
      // Create an image to save
      RenderedImage rendImage = myCreateImage(g2, imageWidth, imageHeight);
      
      // Write generated image to a file
      try {
          // Save as PNG
          File file = new File("newimage.png");
          ImageIO.write(rendImage, "png", file);
      
          // Save as JPEG
          file = new File("newimage.jpg");
          ImageIO.write(rendImage, "jpg", file);
      } catch (IOException e) {
      }
      
   }
   
// Returns a generated image.
   public RenderedImage myCreateImage(Graphics2D g2, int w, int h) {
       // Create a buffered image in which to draw
       BufferedImage bufferedImage = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);
   
       // Create a graphics contents on the buffered image
       g2 = bufferedImage.createGraphics();
   
     
       // Graphics context no longer needed so dispose it
       g2.dispose();
   
       return bufferedImage;
   }
 
B

Beni

Gast
So könntest du das bauen:
P.S. und nicht jedesmal speichern, wenn gezeichnet wird. Dein Programm wird sehr langsam, wenn alle paar Millisekunden in "paint" ein Bild auf die Festplatte geschrieben wird :wink:
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test extends JPanel{
   public static void main( String[] args ){
       JButton save = new JButton( "Speichern" );
       final Test test = new Test();
       JFrame frame = new JFrame();
       
       save.addActionListener( new ActionListener(){
           public void actionPerformed( ActionEvent e ) {
               test.save();
           }
       });
       
       //frame.add( test, BorderLayout.CENTER );
       //frame.add( save, BorderLayout.SOUTH );  // das geht erst ab Java 1.5  8-)
       
       frame.getContentPane().add( test, BorderLayout.CENTER );
       frame.getContentPane().add( save, BorderLayout.SOUTH );

       frame.setBounds( 20, 20, 500, 500 );
       frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
       frame.setVisible( true );
   }
   
   private Image img;
   private double rad = Math.PI / 3.0;
   
   public Test(){
       BufferedImage image = new BufferedImage( 500, 500, BufferedImage.TYPE_INT_RGB );
       Graphics g = image.getGraphics();
       g.setColor( Color.WHITE );
       g.fillRect( 0, 0, 500, 500 );
       
       g.setColor( Color.RED );
       g.fillRect( 150, 150, 200, 200 );
       
       img = image;
   }
   
   public void paint(Graphics g) {
       super.paint(g);
       Graphics2D g2 = (Graphics2D) g;
       int cx = getWidth() / 2;
       int cy = getHeight() / 2;
      
       int imageWidth = img.getWidth(this);
       int imageHeight = img.getHeight(this);     
      
       int x = -imageWidth / 2;
       int y = -imageHeight / 2;
       g2.translate(cx, cy);
       g2.rotate(rad);
       g2.drawImage(img, x, y, this);   
    }
    
    public BufferedImage createImage(){
       BufferedImage image = new BufferedImage( getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
       Graphics g = image.getGraphics();
       paint(g);
       return image;
    }
    
    public void save(){
        BufferedImage image = createImage();
        
        try{
            ImageIO.write( image, "png", new File( "test.png" ) );
        }
        catch( IOException ex ){
            ex.printStackTrace();
        }
    }
}
 

redztripe

Mitglied
Hallo Beni,
danke für deine tolle Hilfe !!!!
jedoch hab ich leider immer noch ein Problem ...
wenn ich in deinem programm, statt das von dir gezeichnete bild, eins von meiner festplatte
nehme und dies drehen möchte geht das leider nicht und es wird wieder ein schwarzes bild gespeichert.
kann mir das jemand erklären?

wäre echt super - vielen dank schonmal!

redZtripe
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Was ist ein Shape, also klar ein Objekt, aber was ist damit gemeint (Graphics2d)? Und was sidn affinetransformationen AWT, Swing, JavaFX & SWT 1
L Graphics2d zoomen AWT, Swing, JavaFX & SWT 3
L AWT graphics2d transform AWT, Swing, JavaFX & SWT 7
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
Soloeco Graphics2D - Verbinden zweier Punkte AWT, Swing, JavaFX & SWT 6
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
D AWT Graphics2D getClip gibt null zurück AWT, Swing, JavaFX & SWT 3
B Graphics2D Componente Drehen AWT, Swing, JavaFX & SWT 2
M Graphics2D: drawString Berechnung AWT, Swing, JavaFX & SWT 1
X AWT Graphics2D zum LWJGL Display hinzufügen aber wie? AWT, Swing, JavaFX & SWT 4
D Graphics2D einen Bereich füllen AWT, Swing, JavaFX & SWT 1
M JPanel und Graphics2D AWT, Swing, JavaFX & SWT 2
S Java2D/Graphics2D in Android..? AWT, Swing, JavaFX & SWT 2
B Graphics2d drawString mit double Werten? AWT, Swing, JavaFX & SWT 5
S Graphics2D: Transparent übereinander zeichnen AWT, Swing, JavaFX & SWT 7
S Graphics2D - setClip() AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Graphics2D object in ein anderes Zeichnen AWT, Swing, JavaFX & SWT 7
S AWT Pong - Probleme mit übergreifenden Objekten && Graphics2D AWT, Swing, JavaFX & SWT 3
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
N AWT Graphics2D mehrmals aufrufen AWT, Swing, JavaFX & SWT 5
Developer_X Swing Graphics2D.zoom, wie rückgängig machen? AWT, Swing, JavaFX & SWT 6
Developer_X Swing Graphics2D translate zerstört performance AWT, Swing, JavaFX & SWT 2
N graphics2d auf panel AWT, Swing, JavaFX & SWT 2
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
0 AWT Graphics2D.drawImage() funktioniert nicht mehr korrekt mit Core i7 AWT, Swing, JavaFX & SWT 4
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
A Swing Mit Graphics2D auf transparentem Hintergrund zeichnen AWT, Swing, JavaFX & SWT 7
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
cowabunga1984 Implementierung von Graphics2D AWT, Swing, JavaFX & SWT 2
C Graphics2D, Text abschneiden AWT, Swing, JavaFX & SWT 2
N Graphics2D mit unterschiedlichen Grauwerten befüllen AWT, Swing, JavaFX & SWT 3
F Graphics2D scale und Positionierung einer TextArea AWT, Swing, JavaFX & SWT 8
F JPanel: Graphics2D, scale und Mauskoordinaten AWT, Swing, JavaFX & SWT 4
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
M Graphics2D - abstract void draw(.) AWT, Swing, JavaFX & SWT 2
R AffinrTransform + Graphics2D verschieben AWT, Swing, JavaFX & SWT 3
R Graphics2D + Bild anzeigen. AWT, Swing, JavaFX & SWT 25
M Probleme mit Graphics2D AWT, Swing, JavaFX & SWT 7
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
J JavaFX ImageView rotieren lassen AWT, Swing, JavaFX & SWT 1
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
S 2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung" AWT, Swing, JavaFX & SWT 2
M [JavaFX] Objekt um Zentrum rotieren (Camera) AWT, Swing, JavaFX & SWT 1
R TriangleMesh verschwindet teilweise beim resizen des Frames, sowie beim rotieren? AWT, Swing, JavaFX & SWT 1
U Image mit Zeichenbereich rotieren AWT, Swing, JavaFX & SWT 3
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
T 2D-Grafik Rotieren von Bildern AWT, Swing, JavaFX & SWT 3
S einzelnd Rotieren AWT, Swing, JavaFX & SWT 5
Luk10 2D-Grafik BufferedImage sauber rotieren AWT, Swing, JavaFX & SWT 16
G Punkt um ein Rotationszentrum rotieren lassen AWT, Swing, JavaFX & SWT 15
G Text rotieren: Frage zu einem Beispiel AWT, Swing, JavaFX & SWT 5
S swing komponenten mit mouselistener rotieren AWT, Swing, JavaFX & SWT 15
R JSpinner rotieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben