java - 图像旋转后使用 DrawImage() 显示整个图像

标签 java image image-processing rotation java-2d

我正在使用AffineTransform旋转和缩放图像。当我使用 Graphics2D.drawImage() 显示图像时,整个图像不会显示,因此我调用 AffineTransform.translate 方法。
这是我当前编写的代码:

protected void paintComponent(Graphics g) { 
  super.paintComponent(g); 
  Graphics2D g2d =   (Graphics2D) g.create(); 
  Dimension dim = getPreferredSize();
  int x = (getWidth() - image.getWidth(null)) / 2; 
  int y = (getHeight() - image.getHeight(null)) / 2; 
  double angle = Math.toRadians(rotateAngle); 
  AffineTransform identity = new AffineTransform();
  identity.scale(scale, scale); 
  identity.translate(x,y); 
  AffineTransform at = new AffineTransform(); 
  setPreferredSize(new Dimension((int)(identity.getTranslateX()+(image.getWidth(null)*scale)),(int)(identity.getTranslateY()+(image.getHeight(null)*scale))));  
  at.setTransform(identity);
  at.rotate(angle); 
  g2d.transform(at); 
  g2d.drawImage(image, 0, 0, this); 
  g2d.dispose(); 
}

translate方法有时会显示整个图像,有时则不显示,具体取决于图像大小和旋转角度。无论如何,是否可以确保旋转后显示整个图像。

我查看了之前提出的问题: Java2D Image Rotation Issue 但那里发布的解决方案给我带来了同样的问题。

最佳答案

我终于找到了一种方法,可以在 90 度上做到这一点,但对于其他度数则不起作用。

void rotate90(){
  if(image!=null){
            int w = image.getWidth(null); //the Width of the original image
    int h = image.getHeight(null);//the Height of the original image            
    if(w>h){
            BufferedImage dimg = new BufferedImage(w, w,  BufferedImage.TYPE_3BYTE_BGR );
            Graphics2D g = dimg.createGraphics();
            g.translate(-(w-h), 0);
            g.rotate(Math.toRadians(90), w/2, w/2);
            g.drawImage(image, 0, 0,null);
            BufferedImage bimg = new BufferedImage(h, w,  BufferedImage.TYPE_3BYTE_BGR );       
            Graphics2D g2 = (Graphics2D)bimg.getGraphics();
            g2.drawImage(dimg,0,0,h,w,0,0,h,w,null);
            dimg.flush();
            dimg=null;
            image = createImage(bimg.getSource());
            bimg.flush();
            bimg= null;
    }
    else{
            BufferedImage dimg = new BufferedImage(h, h,  BufferedImage.TYPE_3BYTE_BGR );
            Graphics2D g = dimg.createGraphics();
            g.translate(-(w-h), 0);
            g.rotate(Math.toRadians(90), w/2, w/2);
            g.drawImage(image, 0, 0,null);
            BufferedImage bimg = new BufferedImage(h, w,  BufferedImage.TYPE_3BYTE_BGR );       
            Graphics2D g2 = (Graphics2D)bimg.getGraphics();
            g2.drawImage(dimg,0,0,h,w,0,0,h,w,null);
            dimg.flush();
            dimg=null;
            image = createImage(bimg.getSource());
            bimg.flush();
            bimg= null;
    }
  }
}


void rotateClockWise(){
 if(image!=null){
 rotate90();
 setPanelsize();
 revalidate();       
 repaint();
   }

}

关于java - 图像旋转后使用 DrawImage() 显示整个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23157987/

相关文章:

java - 如何显示来自 HTTP Web 服务器的图像?

python - 即使图像在 Python 中的 OpenCV 中包含多条线,霍夫线变换也仅识别一条线

java - 哪个 Java 数据对象用于多维范围匹配?

css - 如何在源重定向时显示 CSS 背景图像?

Java 'SyncServer' 允许两个用户同时编辑一个字符串变量

html - img 高度 "jumps"宽度 : 100% on site load

python - Face Plus Plus Python API更改参数

python - 在3.4.2.0(Python 3)以上的cv2版本上使用SIFT算法

java - 代码段的时间复杂度

java - 我可以使用基本身份验证通过 GET REST 请求从 JAVA 访问 SharePoint 2010 吗?