drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) |
功能说明
这个方法的作用是把图片的特定区域绘制到屏幕上,并且在绘制的过程中可以对图片进行缩放处理,让它和你设定的目标区域相契合。而且,图片中透明的部分不会覆盖原来已经存在的像素。
参数解释
- img:这是你要绘制的图片。要是这个参数为空,那么这个方法就不会进行任何操作。
- 目标矩形(dx1, dy1, dx2, dy2):这是用来确定图片最终显示位置和大小的区域。
- (dx1, dy1)是目标区域左上角的坐标。
- (dx2, dy2)是目标区域右下角的坐标。
- 源矩形(sx1, sy1, sx2, sy2):此区域用于确定你想从原图中截取哪一部分。
- (sx1, sy1)是原图中你要截取区域左上角的坐标。
- (sx2, sy2)是原图中你要截取区域右下角的坐标。
- observer:当图片加载进度有更新时,系统会通知这个对象。
缩放规则
系统会自动把源矩形区域映射到目标矩形区域。在这个过程中,可能会对图片进行缩放或者翻转操作,具体情况如下:
- 如果目标区域比源区域大,图片会被放大。
- 如果目标区域比源区域小,图片则会被缩小。
- 要是源矩形的坐标顺序和目标矩形的坐标顺序不一致,图片就会被翻转。
返回值情况
- 返回
false
表示图片还在加载或者处理中。 - 返回
true
表示图片已经完全加载完成并且可以正常显示。
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.*;
public class drawImageDemoA extends JFrame {
drawImageDemoA_Panel panel;
drawImageDemoA(){
super("练习图片翻转");
setBounds(600, 200, 600, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
panel = new drawImageDemoA_Panel();
add(panel);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(() ->{
new drawImageDemoA().setVisible(true);
});
}
class drawImageDemoA_Panel extends JPanel{
Image image = new ImageIcon("color.png").getImage();
drawImageDemoA_Panel(){}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(image, 0, 0, image.getWidth(this)/3, image.getHeight(this)/3, 0, 0, image.getWidth(this)/3, image.getHeight(this)/3, this);
g2.drawImage(image, image.getWidth(this)/3, 0, image.getWidth(this)/3+image.getWidth(this)/3, image.getHeight(this)/3,
image.getWidth(this)/3, 0, image.getWidth(this)/3+image.getWidth(this)/3, image.getHeight(this)/3, this);
g2.drawImage(image, image.getWidth(this)/3+image.getWidth(this)/3, 0, image.getWidth(this)/3+image.getWidth(this)/3+image.getWidth(this)/3, image.getHeight(this)/3,
image.getWidth(this)/3+image.getWidth(this)/3, 0, image.getWidth(this)/3+image.getWidth(this)/3+image.getWidth(this)/3, image.getHeight(this)/3, this);
}
}
}
这个方法很适合在需要实时缩放图片或者显示大图片局部的场景中或者翻转图片,比如游戏角色运动时碰见障碍物改变运动方向等等场景中使用,不过要留意异步加载可能会带来的延迟问题。