【问题标题】:How to rotate ImageIcon by a certain amount of degrees in Java Swing?如何在 Java Swing 中将 ImageIcon 旋转一定度数?
【发布时间】:2022-11-20 00:57:43
【问题描述】:

我需要将 ImageIcon 旋转到 Java 中的缓冲图像。我已经尝试了所有可能的方法,有没有什么办法,我已经尝试将 ImageIcon 转换为 bufferedImage。

我尝试了所有可能的 StackOverflow 解决方案

【问题讨论】:

  • 请提供足够的代码,以便其他人可以更好地理解或重现问题。

标签: java swing


【解决方案1】:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class Test {

    public static void main(String[] args) {
        // Create GUI
        GUI gui = new GUI();

        // Schedule task; rotate img every 1s
        Timer timer = new Timer(1000, e -> gui.rotateImg());
        timer.setRepeats(true);
        timer.start();
    }

    static class GUI extends JFrame {
        // Web url for image of cute doggo
        private static final String IMAGE_URL = "https://i.pinimg.com/736x/10/b2/6b/10b26b498bc3fcf55c752c4e6d9bfff7.jpg";

        // Cache image and UI components for rotation
        private BufferedImage image;
        private ImageIcon icon;
        private JLabel label;

        // Create new JFrame
        public GUI() {
            // Config grame
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(700, 700);
            setLocationRelativeTo(null);

            URL url;
            image = null;

            try {
                // Download + cache image from web
                url = new URL(IMAGE_URL);
                image = ImageIO.read(url);
            } catch (IOException e) {
                // Handle error downloading
                System.out.println("Failed to read image due to: " + e.getMessage());
            } finally {
                // On success - create/cache UI components
                if (image != null) {
                    // In this example I am using a label here to display an ImageIcon
                    // But at root the ImageIcon is holding a BufferedImage which is what we're modifying on rotation
                    add(label = new JLabel(icon = new ImageIcon(image)));
                }
            }

            // Show configured JFrame
            setVisible(true);
        }

        public void rotateImg() {
            if (image == null) return;

            // Rotate image
            BufferedImage rotated = rotateImg(image, Math.toRadians(90));

            // Add rotated image
            icon.setImage(image = rotated);

            // Repaint
            label.revalidate();
            label.repaint();
        }

        // SRC: https://www.delftstack.com/howto/java/java-rotate-image/
        private BufferedImage rotateImg(BufferedImage img, double degrees) {
            int w = img.getWidth(), h = img.getHeight();

            BufferedImage imgCopy = new BufferedImage(w, h, img.getType());
            Graphics2D g2d = imgCopy.createGraphics();

            g2d.rotate(degrees, w / 2, h / 2);
            g2d.drawImage(img, null, 0, 0);

            return imgCopy;
        }
    }
}

【讨论】:

  • 更新用户界面是错误的- 查看 api 文档。另外:这里不需要 invokeLater:在 EDT 上调用 rotate(来自 Timer 的 actionListener)
  • @kleopatra 问题是如何旋转缓冲图像。不过我确实改进并更新了示例代码,感谢您的建议。我不是 Swing 专家,但我相信更好的调用是重新验证和重绘而不是 updateUI?希望您能在这里发表见解。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2012-12-17
  • 2019-10-16
相关资源
最近更新 更多