我想画一个圆形游戏板的一部分。这个板旋转,但我想保持一个恒定的视口。我的计划是创建一个全板的BufferedImage,旋转它,然后用图形绘制方法绘制一个居中的部分。但是,Graphics没有旋转,Graphics2D无法绘制图像的一部分。
有什么想法吗?
答案 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
并继承父类的所有方法。Graphics
对象应该是Graphics2D
实例。在此代码中,我将通过绘制到BufferedImage
中显示的JLabel
来执行第二个假设。在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);
}
}