如何使用 g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2) 缩放图像?
How do I scale an image with g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2)?
我需要为我的游戏渲染大量图像,并且需要将它们缩放到任何宽高比以适合屏幕,我找不到任何解决方案。
它已经渲染了图像,只是宽高比不正确。
渲染代码:
class _canvas extends JComponent {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (renderable_object part : objs) {
if (part.type == 5) {
g.drawImage(part.get_Image(), part.i, part.j, 23,23);
}
}
}
}
可渲染对象:
class renderable_object {
int i = 0;
int j = 0;
int k = 0;
int l = 0;
int type = 0;
String file = "";
Image get_Image() {
return(Toolkit.getDefaultToolkit().getImage(file));
}
}
您显示的代码根本没有缩放图像。您至少可以通过两种方式从这里开始。
您已经找到了正确的使用方法(查看问题的标题)。使用该方法,您可以定义源坐标和目标坐标,并相应地进行渲染。看来您需要确保您要求的坐标具有正确的纵横比。
另一种可能性是将 Graphics 转换为 Graphics2D,然后使用 https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/Graphics2D.html#drawImage(java.awt.Image,java.awt.geom.AffineTransform,java.awt.image.ImageObserver) 实际渲染图像。
图像的缩放和精确定位现在可以通过 AffineTransform 完成,你可以通过
获得
getScaleInstance(double sx, double sy).concatenate(getTranslateInstance(double tx, double ty))
所以设置起来可能更容易。这样也很容易应用旋转、剪切或其他东西。
我需要为我的游戏渲染大量图像,并且需要将它们缩放到任何宽高比以适合屏幕,我找不到任何解决方案。
它已经渲染了图像,只是宽高比不正确。
渲染代码:
class _canvas extends JComponent {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (renderable_object part : objs) {
if (part.type == 5) {
g.drawImage(part.get_Image(), part.i, part.j, 23,23);
}
}
}
}
可渲染对象:
class renderable_object {
int i = 0;
int j = 0;
int k = 0;
int l = 0;
int type = 0;
String file = "";
Image get_Image() {
return(Toolkit.getDefaultToolkit().getImage(file));
}
}
您显示的代码根本没有缩放图像。您至少可以通过两种方式从这里开始。
您已经找到了正确的使用方法(查看问题的标题)。使用该方法,您可以定义源坐标和目标坐标,并相应地进行渲染。看来您需要确保您要求的坐标具有正确的纵横比。
另一种可能性是将 Graphics 转换为 Graphics2D,然后使用 https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/Graphics2D.html#drawImage(java.awt.Image,java.awt.geom.AffineTransform,java.awt.image.ImageObserver) 实际渲染图像。 图像的缩放和精确定位现在可以通过 AffineTransform 完成,你可以通过
获得getScaleInstance(double sx, double sy).concatenate(getTranslateInstance(double tx, double ty))
所以设置起来可能更容易。这样也很容易应用旋转、剪切或其他东西。