java - 我正在 java 中旋转图像,但想保存旋转图像

标签 java image swing graphics2d

我正在使用 AffineTransform 旋转图像,并且我尝试通过 ImageIo.write 保存旋转的图像,它正在保存图像,但不是旋转的图像,它正在保存原始图像。所以请告诉我如何纠正它,提前致谢。

这是我的旋转和保存图像的代码

公开课图片{

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();
    }
    }
}

最佳答案

首先,这不是旋转图像,而是旋转用于显示图像的Graphics上下文,它根本不影响原始图像

@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();
  }

它只是将原始图像保存为多种不同的格式......到同一个文件😕,但甚至不对角度的任何变化使用react

相反,您需要使用一些东西来从原始图像生成新图像,并旋转您想要的数量......

  public BufferedImage rotateImageByDegrees(BufferedImage img, double degrees) {
        double rads = Math.toRadians(degrees);
        double sin = Math.abs(Math.sin(rads)), cos = Math.abs(Math.cos(rads));
        int w = img.getWidth();
        int h = img.getHeight();
        int newWidth = (int) Math.floor(w * cos + h * sin);
        int newHeight = (int) Math.floor(h * cos + w * sin);

        BufferedImage rotated = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = rotated.createGraphics();
        AffineTransform at = new AffineTransform();
        at.translate((newWidth - w) / 2, (newHeight - h) / 2);

        int x = clickPoint == null ? w / 2 : clickPoint.x;
        int y = clickPoint == null ? h / 2 : clickPoint.y;

        at.rotate(rads, x, y);
        g2d.setTransform(at);
        g2d.drawImage(img, 0, 0, this);
        g2d.setColor(Color.RED);
        g2d.drawRect(0, 0, newWidth - 1, newHeight - 1);
        g2d.dispose();

        return rotated;
  }

然后您可以保存它...

File imagefile = new File("C:/pics/1206.jpg");
image = ImageIO.read(imagefile);

BufferedImage rotated = rotateImageByDegrees(image, 22.5);
ImageIO.write(rotated, "png", new File("RotatedBy225.png"));

所以,下次您使用 my previous examples 之一时我告诉你,它没有按照你的想法/想要的那样做,我希望你能更好地理解我的意思😉,并更仔细地看看另一个examples我们向您展示

关于java - 我正在 java 中旋转图像,但想保存旋转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44799392/

相关文章:

java - 值事件监听器返回 Null

swing - 如何在 JEditorPane 中使用 Netbeans 平台语法高亮?

Java Standalone 可运行的 GUI 应用程序 - 无法获取 jar 文件来打开程序

java - mockito spy 不适用于工厂 bean 方法

Java自定义注解和动态加载

java - 如何使用Spring Boot Java应用程序不断从服务总线队列中拉取消息

Python 在 PIL Image 对象上保存 matplotlib 图

php - 我的 php 程序没有将上传的图像移动到目录(ubuntu)

php - 如何使用 jquery imgAreaSelect 使用 php 裁剪图像?

java - 禁用 JDialog Box 上的 Escape 键