【问题标题】:How to render tilted images in Java?如何在 Java 中渲染倾斜的图像?
【发布时间】:2011-05-20 05:04:04
【问题描述】:

我的问题是我有一个呈现图像的 Java 应用程序。现在我想渲染一个倾斜的图像。

一种直接的方法是生成一个倾斜的图像然后渲染它,但我的目标是根据窗口中的鼠标移动来倾斜图像。

一个可能的解决方案是在不同的倾斜角度有多个图像并在鼠标移动时渲染它们,但这样的实现在精度上是有限的,并不是我想要的。

有没有办法即时渲染倾斜的图像?

提前致谢。

【问题讨论】:

    标签: java image-processing image-manipulation


    【解决方案1】:

    我认为您需要查看AffineTransform 它有一种旋转形状的方法以及其他变换。

    An example of how it can be used can be found here

    基本上:

    AffineTransform at = AffineTransform.getTranslateInstance(width, height); //Create the AffineTransform instance
    at.rotate(someRadianValue); // Apply the transforms you wish
    g2.draw(at.createTransformedShape(myShape)); // Draw the transformed shape
    

    【讨论】:

    • html是什么意思?这是 Java 还是 JavaScript 问题?
    • @sasidhar,嗯...您确实编写了 Java,也许如果您明确说明您正在使用什么技术,那么您可以获得更好的答案。无论如何,我不知道这是如何在 HTML/Javascript 中完成的。
    • 实际上我正在用java开发一个需要这个功能的游戏..但是当我开始描述我的问题时......我想如果我能在html中做到这一点,我可以很好地设计我的网站...... ..所以添加它作为最后一个片段......
    • “我想如果我可以在 html 中做到这一点,我可以很好地设置我的网站的样式......所以将它添加为最后一个片段” - 抱歉,但这很令人困惑,仍然没有澄清任何内容。同样,您使用的是 Java 还是 JavaScript?如果是 Java,HTML 如何与您的程序配合使用?
    【解决方案2】:

    我完全同意上一篇文章,AffineTransform 是要走的路。这是一个简单的例子......

    import java.awt.*;
    import java.awt.geom.*;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class RotateImage {
        private static final int PANEL_WIDTH = 600;
        private static final Dimension MAIN_SIZE = new Dimension(PANEL_WIDTH, PANEL_WIDTH);
        private static final int SLIDER_MIN = -180;
        private static final int SIDER_MAX = 180;
        private static final int MAJOR_TICK = 30;
        private static final int MINOR_TICK = 15;
        private static final String URL_PATH = "http://duke.kenai.com/guitar/DukeAsKeith-daylightSmall.png";
    
        private JPanel mainPanel = new JPanel();
        private JPanel drawingPanel = createDrawingPanel();
        private AffineTransform transform = new AffineTransform();
        private JSlider rotationSlider;
        private Image image;
    
        public RotateImage() {
            mainPanel.setLayout(new BorderLayout());
            mainPanel.add(drawingPanel, BorderLayout.CENTER);
            mainPanel.add(createTransformPanel(), BorderLayout.SOUTH);
    
            URL url;
            try {
                url = new URL(URL_PATH);
                image = ImageIO.read(url ); 
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private JPanel createTransformPanel() {
            rotationSlider = new JSlider(SLIDER_MIN, SIDER_MAX, 0);
            rotationSlider.setMajorTickSpacing(MAJOR_TICK);
            rotationSlider.setMinorTickSpacing(MINOR_TICK);
            rotationSlider.setPaintLabels(true);
            rotationSlider.setPaintTicks(true);
            rotationSlider.setPaintTrack(true);
            rotationSlider.setSnapToTicks(true);
            rotationSlider.addChangeListener(new SliderListener());
    
            JPanel transformingPanel = new JPanel(new BorderLayout());
            transformingPanel.setBorder(BorderFactory.createEtchedBorder());
            transformingPanel.add(rotationSlider);
            return transformingPanel;
        }
    
        @SuppressWarnings("serial")
        private JPanel createDrawingPanel() {
            if (drawingPanel != null) {
                return drawingPanel;
            }
            drawingPanel = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    myPaint(g);
                }
            };
    
            drawingPanel.setPreferredSize(MAIN_SIZE);
            return drawingPanel;
        }
    
        private void myPaint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setStroke(new BasicStroke(3));
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            AffineTransform oldTransform = g2.getTransform();
            if (transform != null) {
                g2.setTransform(transform);
            }
            if (image != null) {
                g2.drawImage(image, 70, 70, null);
            }
            g2.setTransform(oldTransform);
        }
    
        public JComponent getPanel() {
            return mainPanel;
        }
    
        private class SliderListener implements ChangeListener {
            public void stateChanged(ChangeEvent e) {
                double theta = Math.PI * rotationSlider.getValue() / 180;
                double center = (double) PANEL_WIDTH / 2;
                transform = AffineTransform.getRotateInstance(theta, center, center);
                drawingPanel.repaint();
            }
        }
    
        private static void createAndShowGUI() {
            JFrame frame = new JFrame("RotateShape Application");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new RotateImage().getPanel());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 2019-03-12
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多