用Java绘制旋转图像的一部分

时间:2014-03-20 18:06:28

标签: java swing user-interface awt

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

  

" Graphics2D没有办法绘制图像的一部分。"

那不是真的。 Graphics2D继承自Graphics 方法。这允许绘制图像的部分。查看示例用法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坐标。
  •   
  • 观察者 - 当更多图像被缩放和转换时要通知的对象。
  •   

答案 1 :(得分:2)

您可以转换为Graphics 2D

How to rotate Graphics in Java

为了让它变得旋转'。

要绘制其中的一部分,我认为您可以使用剪辑方法

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

并给它一个合适的形状。

答案 2 :(得分:2)

正如其他人所说:

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

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

enter image description here

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