【问题标题】:Draw a portion of a rotated image in Java [closed]在Java中绘制旋转图像的一部分[关闭]
【发布时间】:2014-03-21 10:40:44
【问题描述】:

我正在尝试绘制圆形游戏板的一部分。该板旋转,但我想保持恒定的视口。我的计划是创建整个板的 BufferedImage,旋转它,然后用图形绘制方法绘制一个居中的部分。但是,Graphics 没有旋转,Graphics2D 没有办法绘制图像的一部分。

有什么想法吗?

【问题讨论】:

标签: java swing user-interface awt


【解决方案1】:

“Graphics2D 无法绘制图像的一部分。”

那不是真的。 Graphics2D 继承自 Graphics this 方法。这允许绘制图像的一部分。查看示例用法here

public abstract boolean drawImage(Image img,
                              int dx1,
                              int dy1,
                              int dx2,
                              int dy2,
                              int sx1,
                              int sy1,
                              int sx2,
                              int sy2,
                              ImageObserver observer)

绘制当前可用的指定图像的指定区域,动态缩放以适合目标可绘制表面的指定区域。透明像素不会影响已经存在的任何像素。

参数:

  • img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何操作。
  • dx1 - 目标矩形第一个角的 x 坐标。
  • dy1 - 目标矩形第一个角的 y 坐标。
  • dx2 - 目标矩形第二个角的 x 坐标。
  • dy2 - 目标矩形第二个角的 y 坐标。
  • sx1 - 源矩形第一个角的 x 坐标。
  • sy1 - 源矩形第一个角的 y 坐标。
  • sx2 - 源矩形第二个角的 x 坐标。
  • sy2 - 源矩形第二个角的 y 坐标。
  • 观察者 - 当更多图像被缩放和转换时要通知的对象。

【讨论】:

    【解决方案2】:

    您可以投射到图形 2D

    How to rotate Graphics in Java

    为了让它旋转。

    画一部分,我觉得可以用clip方法

    http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#clip(java.awt.Shape)

    并给它一个适当的形状。

    【讨论】:

    • 剪辑似乎是相对于原始图像绘制的,给了我旋转的原始选择。我想要一个旋转背景上的非旋转视口。
    【解决方案3】:

    正如其他人所说:

    • Graphics2D 扩展 Graphics 并继承父类的所有方法。
    • 传递给 Swing 组件的 Graphics 对象应该是 Graphics2D 实例。

    在这段代码中,我通过绘制显示在JLabel 中的BufferedImage 来绕过第二个假设。在 GUI 的顶部,我们可以看到从Example images for code and mark-up Q&As 获得的“完整”图像。在底部,代码将图像裁剪为“黑色”国王,旋转它并绘制一个剪辑版本(重复)。

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    import java.net.URL;
    import java.util.Random;
    import javax.imageio.ImageIO;
    
    class ClippedRotatedImage {
    
        public static void main(String[] args) throws Exception {
            URL url = new URL("http://i.stack.imgur.com/memI0.png");
            final BufferedImage bi = ImageIO.read(url);
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    JPanel gui = new JPanel(new BorderLayout());
    
                    gui.add(new JLabel(
                            new ImageIcon(bi)), 
                            BorderLayout.PAGE_START);
    
                    final BufferedImage bi2 = new BufferedImage(
                            400, 
                            150, 
                            BufferedImage.TYPE_INT_RGB);
                    final JLabel l = new JLabel(
                            new ImageIcon(bi2), SwingConstants.CENTER);
                    gui.add(l, BorderLayout.CENTER);
                    ActionListener animatonListener = new ActionListener() {
                        Random rnd = new Random();
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            Graphics2D g = bi2.createGraphics();
                            int x = rnd.nextInt(bi2.getWidth());
                            int y = rnd.nextInt(bi2.getHeight());
                            double theta = rnd.nextDouble()*2*Math.PI;
                            g.rotate(theta);
                            g.setClip(x,y,64,64);
                            g.drawImage(bi,x,y,null);
                            g.dispose();
    
                            l.repaint();
                        }
                    };
                    Timer timer = new Timer(50, animatonListener);
                    timer.start();
    
                    JOptionPane.showMessageDialog(null, gui);
                    timer.stop();
                }
            };
            // Swing GUIs should be created and updated on the EDT
            // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

    • 这一切都很好,但这不是我需要的。如果主图像被旋转,我需要一个一致的剪辑部分(viewPort)来显示它后面的任何内容。
    • 我不知道你在说什么,直到我向上滚动阅读你对 Carlos 的评论。轻松搞定。在设置剪辑和变换之前绘制它。试试看。如果您无法使其工作,请发布一个 MCTaRE,该 MCTaRE 热链接到上面链接页面中的第二张图片。有几个适合 BG 的图像。 "..但这不是我需要的"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2017-01-04
    相关资源
    最近更新 更多