外观
绘制图片
显示图片
使用Graphics2D对象的drawImage(img, x, y, observer)即可绘制图片。参数说明如下:
- img:Image对象,要绘制的图片。
- x、y:位置。
- observer:绘制图片时要通知的图像观察者。
示例代码:
package JavaDraw;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
public class DrawImage extends JFrame {
private Image img;// 展示的图片
public DrawImage() {
super("绘制图片");
try {
img = ImageIO.read(new File("src/JavaDraw/img.jpg"));// 读取图片文件
} catch (IOException e) {
e.printStackTrace();
}
setBounds(440, 300, 400, 300); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(new CanvasPanel()); // 设置窗体面板为绘图面板对象
}
public static void main(String[] args) {
new DrawImage().setVisible(true);
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
g.drawImage(img, 0, 0, this); // 显示图片
}
}
}运行结果:

图像处理
放大与缩小
使用drawImage()的重载方法即可绘制缩放后的图片:
drawImage(Image img, int x, int y, int width, int height, mageObserver)
示例代码:
package JavaDraw;
import javax.swing.*;
import java.awt.*;
public class PictureZoom extends JFrame {
private final Image img = new ImageIcon("src/JavaDraw/img.jpg").getImage();
private final CanvasPanel canvasPanel = new CanvasPanel();
private int zoomSize = 0;
PictureZoom() {
super("绘制图片");
getContentPane().setLayout(new BorderLayout());
getContentPane().add(canvasPanel);
JPanel jPanel = new JPanel();
setBounds(440, 300, 400, 300); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
add(canvasPanel); // 设置窗体面板为绘图面板对象
//我们使用点击按钮实现改变图片大小 注意在上方定义了缩放比例的全局变量
JButton jButton1 = new JButton("放大(+)");
jButton1.addActionListener(e -> {
zoomSize += 20;
canvasPanel.repaint(); //注意这里要在改变变量之后重新绘图 相当于刷新
});
jPanel.add(jButton1);
JButton jButton2 = new JButton("缩小(-)");
jButton2.addActionListener(e -> {
zoomSize -= 20;
canvasPanel.repaint();
});
jPanel.add(jButton2);
add(jPanel, BorderLayout.SOUTH);
setVisible(true);
}
public static void main(String[] args) {
new PictureZoom();
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g); //若图片处理之后还有原图片 就在此处先调用父类的绘画方法
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(img, 0, 0,
img.getWidth(this) + zoomSize, img.getHeight(this) + zoomSize,
this); // 显示图片
}
}
}运行结果:


当点击放大或缩小后,图片会进行缩放。
图像翻转
实现图像反转需要使用drawImage()的另一个重载方法:
drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
参数说明如下:
- img:要绘制的指定图像。
- dx1:目标矩形的第一个角的x坐标。
- dy1:目标矩形第一个角的y坐标。
- dx2:目标矩形的第二个角的x坐标。
- dy2:目标矩形第二个角的y坐标。
- sx1:源矩形的第一个角的x坐标。
- sy1:源矩形第一个角的y坐标。
- sx2:源矩形的第二个角的x坐标。
- sy2:源矩形第二个角的y坐标。
- observer:当更多的图像被缩放和转换时被通知的对象。
示例代码:
package JavaDraw;
import javax.swing.*;
import java.awt.*;
public class PictureOverturn extends JFrame {
private final Image img = new ImageIcon("src/JavaDraw/img.jpg").getImage();
private int dx1;
private int dy1;
private int dx2;
private int dy2; //此处表示图片的目标矩形坐标 分别代表图片目标矩形的左上横纵坐标和右下的横纵坐标
private int sx1, sy1, sx2, sy2; //此处表示图片的源矩形坐标 分别代表图片源矩形的左上横纵坐标和右下的横纵坐标
private int width;
private int height;
private final CanvasPanel canvasPanel = new CanvasPanel();
PictureOverturn() {
super("绘制图片");
getContentPane().setLayout(new BorderLayout());
getContentPane().add(canvasPanel);
setBounds(440, 300, 400, 300); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
setVisible(true);
width = img.getWidth(this);
height = img.getHeight(this);
//下面代码搞定目标矩形和原矩形的相关信息
sx2 = dx2 = width;
sy2 = dy2 = height;
JPanel jPanel = new JPanel();
jPanel.setLayout(new FlowLayout());
JButton jButton1 = new JButton("水平翻转");
jButton1.addActionListener(e -> {
sx1 = Math.abs(sx1 - width);
sx2 = Math.abs(sx2 - width);
canvasPanel.repaint();
});
jPanel.add(jButton1);
JButton jButton2 = new JButton("竖直翻转");
jButton2.addActionListener(e -> {
sy1 = Math.abs(sy1 - height);
sy2 = Math.abs(sy2 - height);
canvasPanel.repaint();
});
jPanel.add(jButton2);
getContentPane().add(jPanel, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new PictureOverturn();
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g); //若图片处理之后还有原图片 就在此处先调用父类的绘画方法
g.drawImage(img,
dx1, dy1, dx2, dy2,
sx1, sy1, sx2, sy2,
this); // 显示图片
}
}
}运行结果如下:

当点击水平翻转或垂直翻转后,图片会发生改变。

图片旋转
设置图片旋转需要调用Graphics2D的rotate(double theta)方法。theta为要旋转的弧度。
示例代码:
package JavaDraw;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class PictureRotate extends JFrame {
private final Image img = new ImageIcon("src/JavaDraw/img.jpg").getImage();
private double angle;
PictureRotate() {
super("绘制图片");
getContentPane().setLayout(new BorderLayout());
CanvasPanel canvasPanel = new CanvasPanel();
getContentPane().add(canvasPanel);
setBounds(440, 300, 400, 300); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
setVisible(true);
canvasPanel.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
angle += Math.toRadians(5);
repaint();
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
});
}
public static void main(String[] args) {
new PictureRotate();
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.rotate(angle);
g.drawImage(img, 0, 0, this); // 显示图片
}
}
}运行结果如下。当点击图片后图片会旋转。

图片倾斜
使用Graphics2D的shear(double shx, double shy)来倾斜图片。shx、shy分别为对应方向的倾斜度。
示例代码:
package JavaDraw;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class PictureShear extends JFrame {
private final Image img = new ImageIcon("src/JavaDraw/img.jpg").getImage();
private double angleH; //水平倾斜角度
private double angleV; //竖直倾斜角度
PictureShear() {
super("绘制图片");
getContentPane().setLayout(new BorderLayout());
CanvasPanel canvasPanel = new CanvasPanel();
getContentPane().add(canvasPanel);
setBounds(440, 300, 1000, 800); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
setVisible(true);
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
angleV -= Math.toRadians(5);
break;
case KeyEvent.VK_DOWN:
angleV += Math.toRadians(5);
break;
case KeyEvent.VK_LEFT:
angleH -= Math.toRadians(5);
break;
case KeyEvent.VK_RIGHT:
angleH += Math.toRadians(5);
break;
}
canvasPanel.repaint();
}
public void keyReleased(KeyEvent e) {
}
});
}
public static void main(String[] args) {
new PictureShear();
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.shear(angleH, angleV);
g2.drawImage(img, 100, 100,this); // 显示图片
}
}
}运行结果如下。当按下键盘的上下左右键时,图片会向对应的方向倾斜。
