概述: 一个简单的画图板,实现将画布内容保存为本地图片
1、手绘图形
可以画任意图形,即在鼠标拖动下实现任意线段的绘制。
基本原理是扩展swing中的JPanel类(也可以用Java的Canvas类,但两者还是有些区别的)
,同时添加对鼠标的监听。任意的线段绘制,可以看做是一点一点的很小的线段叠加而成,就是点构成线么,即在鼠标拖动监听器里每次采集点,然后跟上一次的点构成线,同时每次都repaint,而在paint方法里就要实现对对所有点的一次绘制。
在这里用到的鼠标监听事件是鼠标的拖动,要实现 MouseMotionListener 这个接口。
完整代码:
import java.awt.BasicStroke; import java.awt.Canvas; import java.awt.Color;
import java.awt.Graphics; import java.awt.Graphics2D; import
java.awt.Rectangle; import java.awt.event.MouseEvent; import
java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import
java.util.ArrayList; import javax.swing.BorderFactory; import
javax.swing.JPanel; public class MyCanvas extends JPanel implements
MouseListener, MouseMotionListener{ private int width = 300; private int height
= 300; private int x = 0; private int y = 0; public ArrayList<Integer[]>
myList = new ArrayList<Integer[]>(); public MyCanvas() { super();
this.setSize(width, height); this.setBounds(new Rectangle(0,0,450,300));
this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
this.setBackground(Color.WHITE); this.setVisible(true);
this.addMouseListener(this); this.addMouseMotionListener(this); } public void
paint(Graphics graphics){ super.paint(graphics); Graphics2D g2d =
(Graphics2D)graphics; g2d.setBackground(Color.WHITE);
g2d.setColor(Color.BLACK); g2d.setStroke(new BasicStroke(10)); for(int
i=0;i<myList.size();i++){ g2d.drawLine(myList.get(i)[0],myList.get(i)[1],
myList.get(i)[2],myList.get(i)[3]); } g2d.dispose(); } @Override public void
mouseDragged(MouseEvent e) { myList.add(new
Integer[]{this.x,this.y,e.getX(),e.getY()}); this.x = e.getX(); this.y
= e.getY(); this.repaint(); } @Override public void mouseMoved(MouseEvent
e) { // TODO Auto-generated method stub } @Override public void
mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override
public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub
this.x = e.getX(); this.y = e.getY(); //首次的点击采集点 } @Override public
void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub }
@Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated
method stub } @Override public void mouseExited(MouseEvent e) { // TODO
Auto-generated method stub } }
在这里遇到一个小问题,本来是用继承Canvas类来做的,但是画布上写东西的时候会不停地闪烁,而且之后图片也一直保存不下来,一直没找到问题所在,换成JPanel就好了,个人猜测是组件在调用repaint()方法时的问题,在这里不多说。屏幕闪烁可以用双缓冲解决。
2、保存图片到本地
主要用到awt的image类以及IO流。
主要步骤:新建一个BufferedImage
,然后利用graphics在其上在画一遍存在于canvas上的内容,然后将BufferedImage保存于本地即可,利用ImageIO里的静态方法write()。
部分代码:
Dimension imagesize = this.canvas.getSize(); BufferedImage image = new
BufferedImage(imagesize.width,imagesize.height,BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics(); this.canvas.paint(graphics);
graphics.dispose(); File f=new File("src/temp/1.jpg"); if( !f.exists()
) { f.createNewFile(); System.out.println(123); }
ImageIO.write(myImage, "jpg",f); return null;
3、调整保存图片的大小
因为笔者需要用到固定大小的图片,所以对图片进行了调整,之后保存。
完整代码:
import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image;
import java.awt.Rectangle; import java.awt.event.ActionEvent; import
java.awt.event.ActionListener; import java.awt.image.BufferedImage; import
java.io.File; import java.io.FileOutputStream; import java.io.IOException;
import javax.imageio.ImageIO; import javax.swing.JButton; import
javax.swing.JFrame; public class MainofFrame extends JFrame{ private int width
= 450; private int height = 450; private MyCanvas canvas = null; public
MainofFrame() { super(); this.setTitle("paint"); this.setSize(width, height);
this.setResizable(false); this.setLocation(400, 180);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(null);
this.canvas = new MyCanvas(); this.add(canvas); this.save = new JButton();
this.save.setText("save"); this.save.setBounds(40, 360, 80, 30);
this.save.addActionListener(new ActionListener() { @Override public void
actionPerformed(ActionEvent e) { try { savePic(); } catch (IOException e1) {
e1.printStackTrace(); } } }); this.add(save); this.setVisible(true); } public
String savePic() throws IOException{ Dimension imagesize =
this.canvas.getSize(); BufferedImage image = new
BufferedImage(imagesize.width,imagesize.height,BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
this.canvas.paint(graphics); graphics.dispose(); Image
newImage = image.getScaledInstance(28, 28, Image.SCALE_SMOOTH);
BufferedImage myImage = new
BufferedImage(28,28,BufferedImage.TYPE_INT_RGB); Graphics graphics1 =
myImage.getGraphics(); graphics1.drawImage(newImage, 0, 0, null);
graphics1.dispose();//对图片调整大小 File f=new
File("src/temp/1.jpg"); if( !f.exists() ) { f.createNewFile();
System.out.println(123); } ImageIO.write(myImage, "jpg",f); return null; } }
正在学习中,如果有错误希望帮忙矫正,十分感谢!
+(在eclipse上复制粘贴过来的,不知道代码为什么排版这么乱,还望谅解。。。)
热门工具 换一换