- 浏览: 7721 次
- 性别:
- 来自: 长沙
文章分类
最新评论
JAVA版的画图工具
今天想实现在图片上画框,并得到各个顶点,就想用JAVA来实现载入图片,并在图片上画线,画框,选择删除操作。
做下来发现有几个问题要注意:
(1),如何用JPANEL做画板,并且载入大图片时,能够有滚动条。
(2),绘图如何保存前一步的操作,以及怎么把矩形打散成线。对图片形的进一步操作
以下是代码,在ECLIPSE中实现
DrawFrame.java
package org.lee.rag; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.JButton; import javax.swing.JScrollPane; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JRadioButton; public class DrawFrame extends JFrame { private JPanel contentPane; private ImagePanel imagePanel; private BufferedImage image=null; private Graphics g=null; private int preX=-1; private int preY=-1; private int currentX=-1; private int currentY=-1; private boolean hlineFlag=false; private boolean vlineFlag=false; private boolean rectFlag=false; private boolean modifyFlag=false; private ButtonPanel bp=new ButtonPanel("形状",new String[]{"横线","竖线","矩形","修改"}); private List<LinkedPoint> lpList=new ArrayList<LinkedPoint>(); private List<Line> lineList=new ArrayList<Line>(); private Line currentLine=null; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { DrawFrame frame = new DrawFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public DrawFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 710, 569); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); JPanel panel = new JPanel(); contentPane.add(panel, BorderLayout.NORTH); JButton openbtn = new JButton("open"); openbtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); chooser.setFileFilter(filter); int returnVal = chooser.showOpenDialog(rootPane); if(returnVal == JFileChooser.APPROVE_OPTION) { try { BufferedImage bImage=ImageIO.read(chooser.getSelectedFile()); int width=bImage.getWidth(); int height=bImage.getHeight(); image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); imagePanel.setPreferredSize(new Dimension(width,height)); g=image.getGraphics(); g.drawImage(bImage,0,0,null); imagePanel.repaint(); imagePanel.updateUI(); } catch (IOException e1) { e1.printStackTrace(); } } } }); panel.add(openbtn); JButton delBtn = new JButton("del"); delBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(currentLine!=null){ lineList.remove(currentLine); currentLine=null; } imagePanel.repaint(); } }); panel.add(delBtn); panel.add(bp); imagePanel=new ImagePanel(); imagePanel.addMouseListener(new MouseListener(){ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub int x=e.getX(); int y=e.getY(); int srcY,srcX,destY,destX; for(int i=0;i<lineList.size();i++){ Line line=lineList.get(i); if(x==line.getSrcX()){ if(line.getSrcY()>line.getDestY()){ srcY=line.getSrcY(); destY=line.getDestY(); } else{ srcY=line.getDestY(); destY=line.getSrcY(); } if(y>=destY && y<=srcY){ currentLine=line; } } if(y==line.getSrcY()){ if(line.getSrcX()>line.getDestX()){ srcX=line.getSrcX(); destX=line.getDestX(); } else{ srcX=line.getDestX(); destX=line.getSrcX(); } if(x>=destX && x<=srcX){ currentLine=line; } } } imagePanel.repaint(); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub currentLine=null; if(bp.getSelection().equals("横线")){ hlineFlag=true; } if(bp.getSelection().equals("竖线")){ vlineFlag=true; } if(bp.getSelection().equals("矩形")){ rectFlag=true; } if(bp.getSelection().equals("修改")){ modifyFlag=true; } preX=e.getX(); preY=e.getY(); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub if(hlineFlag || vlineFlag){ lineList.add(new Line(preX,preY,currentX,currentY)); LinkedPoint lp=new LinkedPoint(preX,preY); lp.add(new LinkedPoint(currentX,currentY)); } if(rectFlag){ lineList.add(new Line(preX,preY,currentX,preY)); lineList.add(new Line(currentX,preY,currentX,currentY)); lineList.add(new Line(preX,currentY,currentX,currentY)); lineList.add(new Line(preX,currentY,preX,preY)); LinkedPoint lp=new LinkedPoint(preX,preY); lp.add(new LinkedPoint(preX,currentY)); lp.add(new LinkedPoint(currentX,preY)); lp.add(new LinkedPoint(currentX,currentY)); lpList.add(lp); } preX=-1; preY=-1; currentX=-1; currentY=-1; hlineFlag=false; vlineFlag=false; rectFlag=false; modifyFlag=false; } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } }); imagePanel.addMouseMotionListener(new MouseMotionListener(){ @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub if(preX>0 && preY>0){ if(hlineFlag){ currentX=e.getX(); currentY=preY; } if(vlineFlag){ currentX=preX; currentY=e.getY(); } if(rectFlag){ currentX=e.getX(); currentY=e.getY(); } imagePanel.repaint(); } } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub } }); imagePanel.setSize(new Dimension(800,1000)); contentPane.add(new JScrollPane(imagePanel), BorderLayout.CENTER); } class ImagePanel extends JPanel{ @Override public void paintComponent(Graphics g){ Graphics2D g2d=(Graphics2D) g.create(); g2d.clearRect(0,0,this.getWidth(), this.getHeight()); g2d.drawImage(image,0,0,null); g2d.setStroke(new BasicStroke(4.0f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); g2d.setColor(Color.red); int width=currentX-preX; int height=currentY-preY; if(rectFlag){ g2d.drawRect(preX, preY, width, height); } if(hlineFlag){ g2d.drawLine(preX, preY, currentX, currentY); } if(vlineFlag){ g2d.drawLine(preX, preY, currentX, currentY); } for(int i=0;i<lineList.size();i++){ Line line=lineList.get(i); g2d.drawLine(line.getSrcX(), line.getSrcY(), line.getDestX(), line.getDestY()); } //画点 if(currentLine!=null){ g2d.setColor(Color.black); g2d.setStroke(new BasicStroke(1.0f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); g2d.drawOval(currentLine.getSrcX()-2, currentLine.getSrcY()-2, 4, 4); g2d.drawOval(currentLine.getDestX()-2, currentLine.getDestY()-2, 4, 4); } g2d.dispose(); } } class ButtonPanel extends JPanel{ private ButtonGroup group; public ButtonPanel(String title,String[] option){ setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), title)); setLayout(new BoxLayout(this,BoxLayout.X_AXIS)); group=new ButtonGroup(); for(int i=0;i<option.length;i++){ JRadioButton b=new JRadioButton(option[i]); add(b); group.add(b); b.setActionCommand(option[i]); b.setSelected(i==0); } } public String getSelection(){ return group.getSelection().getActionCommand(); } } }
Line.java
package org.lee.rag; public class Line { private int srcX; private int srcY; private int destX; private int destY; public Line(){ } public Line(int srcX, int srcY, int destX, int destY){ this.srcX=srcX; this.srcY=srcY; this.destX=destX; this.destY=destY; } public int getSrcX() { return srcX; } public void setSrcX(int srcX) { this.srcX = srcX; } public int getSrcY() { return srcY; } public void setSrcY(int srcY) { this.srcY = srcY; } public int getDestX() { return destX; } public void setDestX(int destX) { this.destX = destX; } public int getDestY() { return destY; } public void setDestY(int destY) { this.destY = destY; } }
LinkedPoint.java
package org.lee.rag; public class LinkedPoint { private int x; private int y; private LinkedPoint currentPoint=null; //后一个节点 private LinkedPoint nextPoint=null; public LinkedPoint(){ init(); } public LinkedPoint(int x,int y){ this.x=x; this.y=y; init(); } private void init(){ currentPoint=this; } public boolean hasNext(){ return (nextPoint==null) ? false : true; } public void add(LinkedPoint point){ if(currentPoint.hasNext()){ currentPoint=currentPoint.getNextPoint(); } currentPoint.setNextPoint(point); } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public LinkedPoint getNextPoint() { return nextPoint; } public void setNextPoint(LinkedPoint nextPoint) { this.nextPoint = nextPoint; } }
相关推荐
画图工具JAVA源代码,模仿系统画图工具。下载解压后有eclipse打开项目.
画图工具用java实现,比较简单,下载直接编译即可运行。老师留的作业。分享给大家
用java实现画图,可以自由画圆,三角形,长方形,并且选择颜色,画出的图形可以保存为jpg文件,也可以打开一个jpg文件进行编辑。
java画图工具(draw) 有源代码 可以画多种图形
一、主要功能 通过java实现一个简单的画图工具。 可以画矩形,圆形,三角形,可以更换颜色等。 二、注意事项 开发环境为eclipse,无数据库。
简单的绘图工具 运用了类的继承 多态 等
使用java开发的简单的绘图工具,可以连接任意两个点,双击清除
用于绘制java直线,简单方便,可以避免覆盖问题,并能直接绘制
Java绘图工具源代码,一个简单的绘图板,适合初学者。
java开源的画图工具,好用,源码,用IDEA开发的
这个桌面画图工具可以实现对当前桌面的截屏,然后在上面标记,这里忙可以切换画笔颜色,类型。可以实现对绘制的桌面进行保存。通过鼠标滚轮可以对桌面进行放大与缩小 桌面画图.jar 双击可以直接运行
没想到用JAVA还能写出这么一个绘图工具,原来JAVA的图像处理功能也很强,想学习一下的可不要错过哦!
GUI界面 实现了简单的画线 圆 矩形 以及颜色 供学习参考使用
用java语言写的画图工具的源代码 代码是由一个一个的步骤来形成的 表明了写画图工具的过程 适合学习参考用 缺点是结构不好
java netbeans 矢量画图工具
Java仿windows开发的画图程序,客户端,包含源码
可画简单图形,如矩形,直线圆等
Java简单画图工具源码 源码描述: 一、源码介绍 1、此代码适合初级阶段的人学习,代码可观性高。开发工具:JDK 1.8、Eclipse。 二、注意事项 1、开发语言:Java,无数据库
哈工大软件学院的java实验,编写一个画图工具,可以画线 直线 圆形 正方形 改变画笔的粗细,以及画笔的颜色,可以使用文件保存功能,相应的实验报告也在这里面
引入这个jar包 下面的代码可以调用 public static void main String args[] { Draw draw new Draw ; draw a args ; }