Announcement

Collapse
No announcement yet.

Ein Bild drehen - Höhe/Breite verkehrt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ein Bild drehen - Höhe/Breite verkehrt

    Ich versuchte mich mal etwas in Java und habe nun ein Problem; ich möchte ein Bild drehen (Image-Klasse), dazu muss ich es erst in ein BufferedImage kopieren (anscheinend). Habe ienen Ausschnitt gefunden zum drehen und nun passiert folgendes:
    Das Bild wird gedreht aber das Image/BufferedImage-Objekt behält seie Höhe/Breite, so dass einen Teil des Bildes abgeschnitten wird und schwarze Ränder entstehen. Ich habe beim Anlegen des BufferedImage-Objekts, in welches die Funktion Java Code:
    private static BufferedImage rotateImage(BufferedImage src, double degrees)
    Code:
    private static BufferedImage rotateImage(BufferedImage src, double degrees)
    das gedrehte Bild zurückgibt aber absichtlich die Höhe/Breite vertauscht! Versuchte es natürlich auch umgekehrt aber immer mit dem Ergebnis.
    Hier etwas mehr Code:
    Code:
    if(Label.equals("drehen")){ 
              turnImage(); 
              m_bildanzeige.repaint(); 
          } 
    
    .... 
    
    public void turnImage() { 
          
          BufferedImage outImg = new BufferedImage(m_aktBild.getWidth(m_bildanzeige), m_aktBild.getHeight(m_bildanzeige), BufferedImage.TYPE_INT_RGB); 
            Graphics g = outImg.getGraphics(); 
            g.drawImage(m_aktBild, 0, 0, null); 
            g.dispose(); 
            BufferedImage turnedImg = new BufferedImage(m_aktBild.getHeight(m_bildanzeige), m_aktBild.getWidth(m_bildanzeige), BufferedImage.TYPE_INT_RGB); 
             turnedImg=rotateImage(outImg, 90); 
             /*Graphics g2=m_aktBild.getGraphics(); 
             g2.drawImage(turnedImg, 0, 0, null); 
             g2.dispose();*/ 
             m_aktBild=turnedImg; 
             m_tempAnzeigeBild=m_aktBild; 
      } 
      
      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; 
      }

  • #2
    Nun

    rotatedImage = new BufferedImage(src.getWidth(), src
    .getHeight(), src.getType());

    nimmt die Größe des Ursprungsbildes.

    Dann schreibst du die Quelle rein? -> g.drawImage(src, 0, 0, null);

    Und gibst etwas zurück? Mit dem du nix machst? ->return rotatedImage;

    Ein Bild, welches gedreht wird, wird immer größer sein, als das Ursprungsbild und es werden zwangsläufig - sofern du nicht in 90 Grad Schritten drehst - schwarze Ränder bleiben.

    Kenne jetzt AffineTransform nicht, aber die müsste doch die neuen Dimensionen zurückgeben, wenn sie schon die Drehung vornimmt?
    Zuletzt editiert von Christian Marquardt; 28.01.2009, 14:24.
    Christian

    Comment


    • #3
      Code:
      turnedImg=rotateImage(outImg, 90);
      hier wird der Rückgabewert ja verwendet.
      Ich versuchte nun folgendes:
      Code:
      BufferedImage turnedImg=rotateImage(outImg, 90);
      anstelle von
      Code:
      BufferedImage turnedImg = new BufferedImage(m_aktBild.getHeight(m_bildanzeige), m_aktBild.getWidth(m_bildanzeige), BufferedImage.TYPE_INT_RGB);
      		turnedImg=rotateImage(outImg, 90);
      allerdings mit dem selben Resultat; anscheinend wird das Grössenverhältnis des Image/BufferedImage nicht angepasst. Es wird auch einen Teil des Bildes abgeschnitten; die Drehung erfolgt nur in 90 Grad Schritten nach rechts.
      Der Code der Funktion private static BufferedImage rotateImage(BufferedImage src, double degrees) habe ich aus dem Internet, ich wusste nicht wie ich das anstellen könnte... Das Bild muss ich zuerst nur von einem Image-Objekt in ein BufferedImage zeichnen, da (anscheinend) kein Cast möglich ist.

      Comment


      • #4
        hmmm, hier mal meine Version Image to BufferedImage...wenn es daran liegt

        Code:
        private byte[] convertImageToBlob(Image image)
            {
            if(image==null)
                {
                return null;
                }
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            try
                {
         
         
         
                int width=image.getWidth(null);
               int height=image.getHeight(null);
               BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
               bi.getGraphics().drawImage(image,0,0,null);
           
             ImageIO.write(bi,"JPEG",baos);
         
         
         
         
                }
            catch(IOException ex)
                {
                logger.error("Fehler beim erzeugen des Bytearrays: "+ex.getMessage());
                }
            return baos.toByteArray();
            }
        Christian

        Comment


        • #5
          Danke, funktioniert auch, aber leider genau gleich wie vorher. Das Problem findet beim Drehen statt, nacher und nicht schon beim Erzeugen des BufferedImage. Bei quadratischen Bildern funktioniert lustigerweise alles bestens, und rechteckige werden einfach permanent zu quadratischen gemacht (mit schwarzen Rändern versteht sich).

          Viel Arbeitsspeicher braucht's auch aber das kenn ich von .NET her schon bei grossen Bildern :-)
          Code:
          Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
          	at java.awt.image.DataBufferInt.<init>(Unknown Source)
          	at java.awt.image.Raster.createPackedRaster(Unknown Source)
          	at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
          	at java.awt.image.BufferedImage.<init>(Unknown Source)
          	at JBildbearbeitung.rotateImage(JBildbearbeitung.java:293)
          Attached Files

          Comment

          Working...
          X