Java旋转图像会变成全黑吗?

Java旋转图像会变成全黑吗?,java,Java,我正在制作一个基本的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); Grap

我正在制作一个基本的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时,图像会变成纯黑色。我是否在创建BuffereImage时出错?我正在使用JLabel更改重绘中的GUI

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

您需要同时旋转和平移,以便旋转中心就是图像的中心。仿射变换旋转方法和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;
   }
}

您需要同时旋转和平移,以便旋转中心就是图像的中心。仿射变换旋转方法和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;
   }
}

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

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

我遇到了同样的问题,我用另一种方法解决了它:

我的照片有一个透明的背景,但我不知道,因为我看它总是在白色背景。不管怎样,当我使用

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

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

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

我也遇到了同样的问题,我用另一种方法解决了这个问题:

我的照片有一个透明的背景,但我不知道,因为我看它总是在白色背景。不管怎样,当我使用

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

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

我认为,如果你没有精确的透明类型,graphics2d可以在黑色背景下工作。

不,即使对于90度以外的度数,这也是错误的,需要一点三角来修正。去睡觉,但明天早上会修好的!不,即使这对于90度以外的度数也是错误的,需要一点三角函数来修正。去睡觉,但明天早上会修好的!