Bild drehen

Benzol

Erfahrenes Mitglied
Ich habe jetzt schon zeihmlich viel darüber gelesen und mir auch eine eigene Funktion gebastelt. Mir scheint aber, das ich da irgentwo einen Wurm drinne habe. Wird wohl daher eher ein logischer Fehler sein ;)

Ich habe ein BufferedImage, in dem mein orginalbild verkleinert reingezeichnet wird. Dieses BuffImg möchte ich jetzt dannach in 90° Grad Schritten rotieren.

Dazu habe ich mir eine Funktion geschrieben, die ein BuffImg annimmt, ein neues BuffImg mit vertauschter Breite/Höhe erstellt, und das angenommene per AffineTransform rotiert in das neue einträgt. Danach wird das neue BuffImg zurückgegeben sodass ich es abspeichern kann. Nur leider bekomme ich immer Schwarze Bilder... :suspekt:
Hier mal ein wenig Code...

Code:
    public BufferedImage RotatePicture(BufferedImage scaledImage, int width, int height)
    {
        AffineTransform trans = AffineTransform.getRotateInstance(90);
        BufferedImage dest = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
        
        Graphics2D g = dest.createGraphics();
        g.drawImage(dest, trans, null);
        g.dispose();
        
        return dest;
    }
 
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * @author Tom
 * 
 */
public class ImageRotatorExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        BufferedImage image = ImageIO.read(new File("c:/Winter_big.jpg"));
        BufferedImage rotatedImage = rotateImage(image, 90.0);
        ImageIO.write(rotatedImage, "jpeg", new File("c:/Winter_big_rot.jpg"));
    }

    private static BufferedImage rotateImage(BufferedImage src, double degrees) {
        AffineTransform affineTransform = AffineTransform.getRotateInstance(
                Math.toRadians(degrees),
                src.getWidth() / 2,
                src.getHeight() / 2);
        BufferedImage rotatedImage = new BufferedImage(src.getWidth(), src
                .getHeight(), src.getType());
        Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
        g.setTransform(affineTransform);
        g.drawImage(src, 0, 0, null);
        return rotatedImage;
    }
}

Gruss Tom
 
  • Gefällt mir
Reaktionen: Orb
Ich versuche nun schon seit einer Stunde dahinter zu kommen, warum er bei mir das Bild nicht genau dort platziert, wo es hingehört :mad:

Es liegt ja an den letzten Beiden Werten am Ende Zeile
Code:
AffineTransform affineTransform = AffineTransform.getRotateInstance(Math.toRadians(degrees),src.getWidth()/2, src.getHeight()/2);

Ich verstehe aber nicht, was diese Werte angeben und warum sich das Bild so verändert, wie es sich verändert, wenn ich die Werte ändere. :confused: Kannst du mir folgen?
 

Anhänge

  • rotate_seltsam.JPG
    rotate_seltsam.JPG
    21,2 KB · Aufrufe: 733
Hmm, das erklärt doch aber noch nicht so richtig, warum das Bild so verschoben ist, oder doch?

EDIT:
Ja ist klar :) Ich habe nichts gesagt... nur ist es doch eigentlich logisch, das Bild im Mittelpunkt zu drehen. Nur warum verschiebt sich das Bild? Muss an der Berechnung noch was geändert werden? Du hast doch dein Beispiel bestimmt getestet... da hat es doch funktioniert. Ich habe es quasi 1 zu 1 übernommen....
 
Zuletzt bearbeitet:
Hat den keiner eine Idee? :confused: Ich komme mit diesem Problem einfach nicht weiter. Habe jetzt schon diverese Berechnungen und Werte ausprobiert... verstehe aber nicht, warum das Bild nicht mittig angezeigt wird.
 
Hallo,
hatte anfangs auch die hässlichen schwarzen Streifen. HAbe dann den Quelltext von Thomas ein wenig aufgebohrt.;)
Hier ist der Code:

Code:
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.image.AffineTransformOp;
import javax.imageio.ImageIO;

public class RotateImage{

 public static int RotAngle = 0;
 
   public RotateImage( int rotate){
      RotAngle =  rotate;
   }

  public static BufferedImage rotateImage(BufferedImage inputImage) {

    int X,Y = 0;
    
    if ((RotAngle == 0)||(RotAngle == 180)||(RotAngle == 360)){
     X = inputImage.getWidth(null);
     Y = inputImage.getHeight(null);
    }else{
     X = inputImage.getHeight(null);
     Y = inputImage.getWidth(null);
    }

    BufferedImage sourceBI = new BufferedImage(X, Y, BufferedImage.TYPE_INT_RGB);

    AffineTransform at = new AffineTransform();

    // rotate around image center
    at.rotate(Math.toRadians( RotAngle ), (sourceBI.getWidth() / 2), (sourceBI.getHeight() / 2) );

    /*
     * translate to make sure the rotation doesn't cut off any image data
     */
    AffineTransform translationTransform;
    translationTransform = findTranslation( at, sourceBI );
    at.preConcatenate( translationTransform );


    Graphics2D g = (Graphics2D) sourceBI.getGraphics();
    g.setTransform(at);
    g.drawImage(inputImage, 0, 0, null);


    return sourceBI;
  }

  /*
   * find proper translations to keep rotated image correctly displayed
   */
  private static AffineTransform findTranslation(AffineTransform at, BufferedImage bi ) {
    Point2D p2din, p2dout;
    double ytrans, xtrans = 0.0;

    AffineTransform tat = new AffineTransform();
    
    if(RotAngle == 180){
      p2din = new Point2D.Double(0, bi.getHeight());
    }else{
      p2din = new Point2D.Double(0.0, 0.0);
    }
    
    p2dout = at.transform(p2din, null);

    if(RotAngle == 270){
      xtrans = p2dout.getX();
      ytrans = xtrans;
    }else{
      ytrans = p2dout.getY();
      xtrans = ytrans;
    }

    //System.out.println("X: "+ (xtrans) +" Y: "+ (ytrans));

    tat.translate(-xtrans, -ytrans);

    return tat;
  }

  public static void main(String[] args)throws Exception {
    BufferedImage inputImage = ImageIO.read(new File( "xyz.jpg" )); 
    new RotateImage( 90 ); // current Angle
    BufferedImage rotatedImage = rotateImage(inputImage);
    ImageIO.write(rotatedImage , "jpeg", new File("xyz.jpg"));
  }

}

Viel Spass damit
 
ich bin am verzweifeln:
ich möchte ein gedrehtes bild in einem applet ausgeben
und zwar mit der mouseMove-Methode

ich probiere da sein ein paar tagen ständig rum und mein letzter stand ist folgender:
Code:
package shoter;
import java.applet.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;




public class Shoter extends Applet {

	Font f = new Font("TimesRoman", Font.BOLD,36);
	String img_left="pic/left.jpg",img_right="pic/right.jpg";
	BufferedImage img_l,img_r;


	Graphics g ; 

	public void init(){
		g=getGraphics();
	}
	
    public static void main(String file)  {
     
    }
    
    private static BufferedImage rotateImage(BufferedImage src, double degrees) {

        AffineTransform affineTransform = AffineTransform.getRotateInstance(
                Math.toRadians(degrees),
                src.getWidth() / 2,
                src.getHeight() / 2);
        BufferedImage rotatedImage = new BufferedImage(src.getWidth(), src
                .getHeight(), src.getType());
        Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
        g.setTransform(affineTransform);
        g.drawImage(src, 0, 0, null);
        return rotatedImage;
    }
	
    public void paint(Graphics g){
	
		g.setFont(f);
		g.setColor(Color.black);
		g.drawString("BDU-Shoter!!",250,50);
	}
	
    public static BufferedImage img (String src)throws IOException{
    	Image ImG= new ImageIcon(ImageIO.read(new File(src))).getImage();
    	BufferedImage img=(BufferedImage)ImG;
    	return img;
    	
    }
    
	public boolean mouseMove(Event theEvent,int x,int y)throws IOException{

		g.setFont(f);
		g.setColor(Color.black);
		
		double i = (double)x;

		g.drawString("test",x,y);
		img_r=img(img_right);
		img_r=rotateImage(img_r,x);
		g.drawImage(img_r,250,250,this);
		

		return true;
	}

}

momentan is das problem das mouseMove nicht kompatibel mit throws IOException ist aber vielleicht wärs besser da nochmal neu mit "etwas" weniger code anzufangen.

ich bedanke mich schon mal im voraus.
 
  • Gefällt mir
Reaktionen: Orb
Hallo!

Ich bin im Vergleich zu euch wohl noch ein Anfänger ^^ Wir arbeiten im Informatik Unterricht gerade an einem Projekt, wo wir ein Rectangle drehen müssen. Ich habe hier jetzt ein paar Quelltexte gefunden, die mir weitergeholfen haben, aber ich weiß nicht, welchen Parameter ich eingeben muss als inputImage? Also muss ich dafür z.B. nen Pfad eingeben(habe ich schon probiert, aber geht nicht) oder nen Objekt oder was?

Code:
public static BufferedImage rotateImage(BufferedImage inputImage,...

Vielen Dank schonmal :)
 

Neue Beiträge

Zurück