图像处理(Canvas类,重写paint方法)(图片的放大缩小,垂直水平翻转,旋转,倾斜)(简单代码例子实现)

import java.awt.BorderLayout;
import java.awt.Canvas;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame {
	private int number = 0;
	private int t = 0;
	private double a = 0;
	private double b = 0;
	private Image img = new ImageIcon("src/a.png").getImage();
	private int sx1, sy1, sx2, sy2;// 源矩形左上角和右下角坐标
	private int dx1, dy1, dx2, dy2;// 目标矩形对应角的坐标
	private int origin, width, height;// 记录原点,图片宽和高

	public Main() {
		origin = 0;
		width = img.getWidth(this);
		height = img.getHeight(this);

		dx1 = sx1 = origin;// 初始化,目标矩形和源矩形左上角坐标在原点上
		dy1 = sy1 = origin;
		dx2 = sx2 = width;
		dy2 = sy2 = height;
		Main1();
	}

	public void Main1() {
		setTitle("绘制几何图形");
		setBounds(100, 200, 500, 500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);

		JPanel p = new JPanel();
		this.setContentPane(p);

		// 方法类
		MyCanvas canvas = new MyCanvas();
		CanvasTest canvas1 = new CanvasTest();
		MyCanvas2 canvas2 = new MyCanvas2();
		MyCanvas3 canvas3 = new MyCanvas3();

		p.setLayout(new BorderLayout());
		// 如果想尝试其他功能请将注释去掉。一个画板只能实现一个形式的功能
		// p.add(canvas, BorderLayout.CENTER);//增大,缩小功能
		// p.add(canvas1, BorderLayout.CENTER);//水平旋转和垂直旋转功能
		// p.add(canvas2, BorderLayout.CENTER);//旋转功能
		p.add(canvas3, BorderLayout.CENTER);// 倾斜功能

		addKeyListener(new KeyAdapter() {// 添加键盘监听。上下左右改动倾斜角度
			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_UP) {
					b -= 0.1;
				}
				if (e.getKeyCode() == KeyEvent.VK_DOWN) {
					b += 0.1;
				}
				if (e.getKeyCode() == KeyEvent.VK_LEFT) {
					a -= 0.1;
				}
				if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
					a += 0.1;
				}
				canvas3.repaint();
			}

		});

		canvas2.addMouseListener(new MouseListener() {// 点击画布旋转

			@Override
			public void mouseClicked(MouseEvent var1) {// 鼠标点击旋转
				t++;
				canvas2.repaint();

			}

			@Override
			public void mousePressed(MouseEvent var1) {
				// TODO 自动生成的方法存根

			}

			@Override
			public void mouseReleased(MouseEvent var1) {
				// TODO 自动生成的方法存根

			}

			@Override
			public void mouseEntered(MouseEvent var1) {
				// TODO 自动生成的方法存根

			}

			@Override
			public void mouseExited(MouseEvent var1) {
				// TODO 自动生成的方法存根

			}
		});
		JPanel p2 = new JPanel();
		JButton button1 = new JButton("增大");
		JButton button2 = new JButton("缩小");
		p2.setLayout(new GridBagLayout());
		p2.add(button1);
		p2.add(button2);
		p.add(p2, BorderLayout.SOUTH);

		JButton button3 = new JButton("水平旋转");
		JButton button4 = new JButton("垂直旋转");
		p2.setLayout(new GridBagLayout());
		p2.add(button3);
		p2.add(button4);
		p.add(p2, BorderLayout.SOUTH);

		button1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent var1) {
				number += 10;
				canvas.repaint();// 画板重绘

			}
		});
		button2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent var1) {
				number -= 10;
				canvas.repaint();
			}
		});

		button3.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent var1) {
				dx1 = Math.abs(dx1 - width);// 两个坐标相减,取绝对值
				dx2 = Math.abs(dx2 - width);
				canvas1.repaint();
			}
		});
		button4.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent var1) {
				dy1 = Math.abs(dy1 - height);// 两个坐标相减,取绝对值
				dy2 = Math.abs(dy2 - height);
				canvas1.repaint();

			}
		});

	}

	private class MyCanvas extends Canvas {
		@Override
		public void paint(Graphics g) {
			int Imagewidth = img.getWidth(this);// 获取宽度,参数随便写
			int Imageheight = img.getHeight(this);// 获取高度,参数随便写
			g.drawImage(img, 0, 0, Imagewidth + number, Imageheight + number, this);// this:图片展示的窗口
		}
	}

	class CanvasTest extends Canvas {
		@Override
		public void paint(Graphics g) {
			g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);
		}
	}

	class MyCanvas2 extends Canvas {
		@Override
		public void paint(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			g2.rotate(Math.toRadians(t));
			g2.drawImage(img, 70, 10, 300, 200, this);// 绘制指定大小的图片
		}
	}

	class MyCanvas3 extends Canvas {
		@Override
		public void paint(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			g2.shear(a, b);// 设置倾斜量
			g2.drawImage(img, 70, 10, 300, 200, this);// 绘制指定大小的图片
		}
	}

	public static void main(String args[]) {
		Main m = new Main();
	}
}

运行结果为(代码有注释,会影响按钮的点击。将注释去掉就可以实现另外几种功能):
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值