【问题标题】:Java rotated image turns all black?Java旋转图像变成全黑?
【发布时间】:2014-05-21 15:48:20
【问题描述】:

我正在制作一个基本的 Java 应用程序并尝试旋转图像。我写了以下快速方法

private Image rotate(double degs){
    ImageIcon img = new ImageIcon("src/inc/img/char_male.png");
    Image temp = new BufferedImage(img.getIconWidth(), img.getIconHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = (Graphics2D) temp.getGraphics();
    g2.rotate(Math.toRadians(degs));
    g2.drawImage(img.getImage(), 0, 0, Color.WHITE, null);
    System.out.println("Rotating "+degs);
    g2.dispose();
    return temp;
}

问题是当我运行它并重新绘制 GUI 时,图像变成纯黑色。我在创建 BufferedImage 时做错了吗?我正在使用 JLabel 更改重绘中的 GUI,

label.setIcon(new ImageIcon(rotate(90)));

【问题讨论】:

    标签: java


    【解决方案1】:

    你需要同时旋转和平移,这样旋转的中心就是图像的中心。 AffineTransform 旋转方法对此有重载,Graphics2D 旋转方法也是如此。例如,如果你尝试,会怎样……

    private Image rotate(double degs){
        ImageIcon img = new ImageIcon("src/inc/img/char_male.png"); // why an ImageIcon???
        Image temp = new BufferedImage(img.getIconWidth(), img.getIconHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) temp.getGraphics();
        g2.rotate(Math.toRadians(degs), img.getIconWidth()/2, img.getIconHeight()/2); // changed
        g2.drawImage(img.getImage(), 0, 0, Color.WHITE, null);
        System.out.println("Rotating "+degs);
        g2.dispose();
        return temp;
    }
    

    抱歉,这里是更正后的代码:

    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    
    public class ImageRotate {
       private static final String IMAGE_PATH = "src/yr2011/images/guitar_3406632_n.jpg";
    
       public static void main(String[] args) {
          try {
             BufferedImage image = ImageIO.read(new File(IMAGE_PATH));
             ImageIcon icon = new ImageIcon(image);
             JOptionPane.showMessageDialog(null, new JLabel(icon));
    
             icon = new ImageIcon(rotate(image, 90));
             JOptionPane.showMessageDialog(null, new JLabel(icon));
          } catch (IOException e) {
             e.printStackTrace();
          }
       }
    
       private static Image rotate(Image image, double degs) {
          int width = image.getWidth(null);
          int height = image.getHeight(null);
          BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
          Graphics2D g2 = temp.createGraphics();
          g2.rotate(Math.toRadians(degs), height / 2, height / 2);
          g2.drawImage(image, 0, 0, Color.WHITE, null);
          g2.dispose();
          return temp;
       }
    }
    

    【讨论】:

    • 不,即使这对于 90 以外的度数也是错误的,需要一点三角函数来修复。去睡觉了,但会在早上解决它!
    【解决方案2】:

    我不使用 Java,所以我无法判断您的代码是否有问题,但是在进行图像旋转时,一个常见的错误是旋转出视口。当您想象原始图像位于坐标原点时,将其旋转 90 度会将图像移动到 x 轴下方(或 y 轴左侧,具体取决于方向)。在这两种情况下,旋转的图像都会离开视口,您会得到一个空图像。解决方法是将旋转后的图像移回原位。

    【讨论】:

      【解决方案3】:

      我有同样的问题,我用另一种方式解决了它:

      我的图片有一个透明背景,但我不知道它,因为我总是在白色背景上看它。无论如何,我在使用时解决了我的问题

      BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_ARGB);
      

      而不是

      BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
      

      如果您不精确的透明类型,我认为 graphics2d 可以使用黑色背景。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-09
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多