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);
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)));
答
您需要旋转并同时转换,这样旋转的中心是图像的中心。 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;
}
}
答
我不使用Java,所以我不能告诉,如果有什么问题与您的代码,但做图像旋转旋转出视口时常见的错误。当您将原始图像想象为坐标原点时,将其旋转90度会将图像移动到x轴下方(或y轴的左侧,取决于方向)。在这两种情况下,旋转的图像都会离开视口,并且您会看到一个空的图像。解决方案是将旋转的图像移回原处。
答
我有同样的probleme和我解决它以另一种方式:
我的照片有一个透明的背景,但我不知道,因为我一直期待它在白色背景。无论如何,我解决我的问题,当我使用的
BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_ARGB);
代替
BufferedImage temp = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB);
我认为,与黑色背景Graphics2D的工作,如果你不这样做精确的透明型。
nope,即使这是90度以外的度数是错误的,需要一个小三角来解决。去睡觉,但将在早上修复它! – 2011-05-08 05:42:26