I';m在java中旋转图像,但要保存旋转后的图像
我正在使用仿射变换旋转图像,并且我已尝试通过ImageIo保存旋转后的图像。write它正在保存图像,但不是旋转后的图像。它正在保存原始图像。所以,请告诉我如何纠正它,谢谢提前 这是我旋转和保存图像的代码 公众阶级形象{I';m在java中旋转图像,但要保存旋转后的图像,java,image,swing,graphics2d,Java,Image,Swing,Graphics2d,我正在使用仿射变换旋转图像,并且我已尝试通过ImageIo保存旋转后的图像。write它正在保存图像,但不是旋转后的图像。它正在保存原始图像。所以,请告诉我如何纠正它,谢谢提前 这是我旋转和保存图像的代码 公众阶级形象{ public static void main(String[] args) { new Image(); } public Image() { EventQueue.invokeLater(new Runnable() { @Override
public static void main(String[] args) {
new Image();
}
public Image() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JSlider slider;
private BufferedImage image;
public TestPane() {
setLayout(new BorderLayout());
try {
File imagefile = new File("C:/pics/1206.jpg");
image = ImageIO.read(imagefile);
ImageIO.write(image, "jpg",new File("C:/pics"));
ImageIO.write(image, "bmp",new File("C:/pics"));
ImageIO.write(image, "gif",new File("C:/picsf"));
ImageIO.write(image, "png",new File("C:/pics"));
} catch (IOException ex) {
ex.printStackTrace();
}
slider = new JSlider();
slider.setMinimum(0);
slider.setMaximum(360);
slider.setMinorTickSpacing(5);
slider.setMajorTickSpacing(10);
slider.setValue(0);
add(slider, BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return image == null ? new Dimension(200, 200) : new Dimension(image.getWidth(), image.getHeight());
}
public double getAngle() {
return Math.toRadians(slider.getValue());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
g2d.setColor(Color.BLACK);
int x = (getWidth() - image.getWidth()) / 2;
int y = (getHeight() - image.getHeight()) / 2;
AffineTransform at = new AffineTransform();
at.setToRotation(getAngle(), x + (image.getWidth() / 2), y + (image.getHeight() / 2));
at.translate(x, y);
g2d.setTransform(at);
g2d.drawImage(image, 0, 0, this);
g2d.dispose();
}
}
}
首先,这不是旋转图像,而是旋转用于显示图像的
图形
上下文,它根本不会影响原始图像
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
g2d.setColor(Color.BLACK);
int x = (getWidth() - image.getWidth()) / 2;
int y = (getHeight() - image.getHeight()) / 2;
AffineTransform at = new AffineTransform();
at.setToRotation(getAngle(), x + (image.getWidth() / 2), y + (image.getHeight() / 2));
at.translate(x, y);
g2d.setTransform(at);
g2d.drawImage(image, 0, 0, this);
g2d.dispose();
}
然后这个
try {
File imagefile = new File("C:/pics/1206.jpg");
image = ImageIO.read(imagefile);
ImageIO.write(image, "jpg",new File("C:/pics"));
ImageIO.write(image, "bmp",new File("C:/pics"));
ImageIO.write(image, "gif",new File("C:/picsf"));
ImageIO.write(image, "png",new File("C:/pics"));
} catch (IOException ex) {
ex.printStackTrace();
}
它只是将原始图像保存为多种不同的格式…请在同一个文件中添加有关写入部分的相关代码。抱歉,Berger现在我已经更新了我的代码,你可以检查它在旋转时将生成一个新图像,这意味着你可以使用
ImageIO.write
保存它。谢谢,程序员,但我已经在使用e ImageIO.write,但它保存的是原始图像,而不是旋转图像。您没有调用ImageIO.write()
在图像旋转后发生。所有的都指定一个父对象
,没有一个指定一个子对象
。非常感谢,但在您的示例中,getAngle给出了错误,并将u分配给ClickPoint对不起,复制/粘贴了代码-getAngle
可以替换为度
,但我已将其更改为仅使用rads
。。。使用这个thanx没有任何问题,但是它没有保存图像。我得到的异常是线程“AWT-EventQueue-0”java.lang.IllegalArgumentException:image==null!位于javax.imageio.ImageTypeSpecifier.createFromRenderImage(未知源代码)位于javax.imageio.imageio.getWriter(未知源代码)在tilti.Image$RotationPane的javax.imageio.imageio.write(未知源代码)处(Image.java:78)在tilti.Image$1.run(Image.java:39)处传递imageio
anull
引用,您需要找出原因