功能说明:

1 鼠标单击:选取裁剪区域

2 鼠标双击:选取裁剪区域,并把裁剪区域保存为文件,同时把区域中心点的坐标保存

3 打开图片:从某个文件夹打开图片并显示,同时把该目录的所有图片的路径载进来。这个功能主要是针对这么种情况,

假如处理某个文件夹的图片集,在某一张终止了或者暂停了,下一次要从这种图片开始。

4 保存坐标:把裁剪区域保存为文件,同时把区域中心点的坐标保存

5 打开目录:把该目录的所有图片的路径载进来。

6 下一张:展示下一张图片。

常见用法:

1 “打开目录”,这时会将目录图片载进来,并显示第一张,这是可以 “鼠标双击”,选取该张图片的裁剪区域,保存坐标和裁剪区域,并展示下一张。

2 假如用法1在某一张图片暂停了,比如关闭该程序。下次可以利用“打开图片”从某张图片开始,然后继续利用“鼠标双击”一张一张处理。

注:其实按钮“保存坐标”和“下一张”只是作为功能测试使用,实际操作可以用“鼠标双击”代替。

下面附上源代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;public class PhotoFrame extends JFrame
{private static final long serialVersionUID = -2216276219179107707L;private Container con;private MousePanel zPanel;private JScrollPane imgSp;private JPanel btnPanel;private String imageDir;private String currImg;//文件名,不包含目录private int currIndex;//当前图片索引ArrayList<String> imgList;//所有图片的绝对路径public void  writeCropImg() throws IOException{BufferedImage sourceImage = (BufferedImage) zPanel.getImg();   Image croppedImage; ImageFilter cropFilter; int x = zPanel.getPointX()-25;int y = zPanel.getPointY()-25;//四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API //指定要裁剪的的文件的宽度和高度,以及起始坐标 cropFilter =new CropImageFilter(x,y,50,50); //生成图片 croppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter)); //获取创建后的图片的高度 int h1=croppedImage.getHeight(null); int w1=croppedImage.getWidth(null); BufferedImage bi=new BufferedImage(w1,h1,BufferedImage.TYPE_INT_RGB); Graphics g=bi.getGraphics(); //在画图的时候可以设置背景色 g.drawImage(croppedImage,0,0,Color.white,null);String dir = imageDir+"_crops";//创建文件输出流  FileOutputStream fos=new FileOutputStream(new File(dir+"/"+currImg)); //将创建的图片写入到输出流 ImageIO.write(bi, "png", fos); fos.close(); }private void showNext(){updateCurrName();zPanel.setImagePath(imgList.get(currIndex)); currIndex++;}private void updateCurrName(){String path = imgList.get(currIndex);int index = path.lastIndexOf('/');currImg = path.substring(index);}private class nextHandler implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e){showNext();          }       }private class openDirHandler implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {JFileChooser chooser = new JFileChooser();chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//设置只能选择目录int returnVal = chooser.showOpenDialog(null);if(returnVal == JFileChooser.APPROVE_OPTION) {imageDir =chooser.getSelectedFile().getPath();imgList = FileTool.refreshFileList(imageDir);currIndex = 0;showNext();//System.out.println ( "你选择的目录是:" + selectPath );//你选择的目录是:/home/linger/imdata/collar}}}private void savePointAndImg(){try {String dir = imageDir+"_points";int x = zPanel.getPointX();int y = zPanel.getPointY();//打开文件File f=new File(dir+"/");if(!f.exists()){                      f.mkdir();}         f=new File(dir+"/"+currImg);if(!f.exists()){                   f.createNewFile();                }         FileOutputStream fos=new FileOutputStream(f);OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");BufferedWriter bw=new BufferedWriter(osw);           //写入文件bw.write(x+","+y);//关闭文件bw.close();osw.close();fos.close();writeCropImg();}catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}private class savePointHandler implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {savePointAndImg();         }               }private class openImageHandler implements ActionListener { public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser();FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG Images", "jpg", "png");chooser.setFileFilter(filter);int returnVal = chooser.showOpenDialog(null);if(returnVal == JFileChooser.APPROVE_OPTION) {File file = chooser.getSelectedFile();imageDir = file.getParent();imgList = FileTool.refreshFileList(imageDir);currImg = file.getName();//文件名,不包含路径// System.out.println();String path = file.getAbsolutePath();currIndex = imgList.indexOf(path);zPanel.setImagePath(path);currIndex++;//内部类访问外部类,可以直接访问的啊}} } private PhotoFrame() {con = getContentPane();con.setLayout(new GridLayout(2,2));zPanel = new MousePanel();//zPanel.setImagePath("/home/linger/17820d01");//绑定图片//zPanel.setPreferredSize(new Dimension(zPanel.getImgWidth(), zPanel.getImgHeight()));imgSp = new JScrollPane();imgSp.setPreferredSize(new Dimension(zPanel.getImgWidth(), zPanel.getImgHeight()));imgSp.setViewportView(zPanel);imgSp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);imgSp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//con.add(imgSp, BorderLayout.CENTER);con.add(imgSp);btnPanel  = new JPanel();btnPanel.setLayout(new FlowLayout());btnPanel.setSize(300,100);JButton button = new JButton("打开图片");button.setSize(100, 50);       btnPanel.add(button);button.addActionListener(new openImageHandler());      button = new JButton("保存坐标");button.setSize(100, 50);        btnPanel.add(button);button.addActionListener(new savePointHandler());button = new JButton("打开目录");button.setSize(100, 50);      btnPanel.add(button);button.addActionListener(new openDirHandler());button = new JButton("下一张");button.setSize(100, 50);     btnPanel.add(button);button.addActionListener(new nextHandler());con.add(btnPanel);zPanel.addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){ if(e.getClickCount() == 2){ savePointAndImg();showNext();}              } });finalSetting();}private void finalSetting() {setTitle("标注工具");Toolkit kit = Toolkit.getDefaultToolkit();Dimension screenSize = kit.getScreenSize();int screenHeight = screenSize.height;int screenWidth = screenSize.width;int frameH = getHeight();int frameW = getWidth();setLocation((screenWidth - frameW) / 2 - 250,(screenHeight - frameH) / 2 - 250);setSize(800, 600);//setSize(zPanel.getImgWidth()+10, zPanel.getImgHeight()+10);//setPreferredSize(new Dimension(zPanel.getImgWidth()+100, zPanel.getImgHeight()+100)); //pack();  setVisible(true);setResizable(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {new PhotoFrame();}}
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;import javax.imageio.ImageIO;public class ImgPanel extends javax.swing.JPanel
{private static final long serialVersionUID = 1L;private Image image;private int imgWidth;private int imgHeight;public Image getImg(){return image;}public int getImgWidth() {return imgWidth;}public void setImgWidth(int imgWidth) {this.imgWidth = imgWidth;}public int getImgHeight() {return imgHeight;}public void setImgHeight(int imgHeight) {this.imgHeight = imgHeight;}public ImgPanel() {}public void setImagePath(String imgPath) {// 该方法不推荐使用,该方法是懒加载,图像并不加载到内存,当拿图像的宽和高时会返回-1;// image = Toolkit.getDefaultToolkit().getImage(imgPath);try {// 该方法会将图像加载到内存,从而拿到图像的详细信息。image = ImageIO.read(new FileInputStream(imgPath));//读取图片的大小setImgWidth(image.getWidth(this));setImgHeight(image.getHeight(this));this.repaint();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void paintComponent(Graphics g1) {super.paintComponent(g1);int x = 0;int y = 0;Graphics g = (Graphics) g1;if (null == image) {return;}g.drawImage(image, x, y, image.getWidth(this), image.getHeight(this),this);           g = null;}
}
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MousePanel extends ImgPanel//JPanel
{int x_pos,y_pos;public int getPointX(){return x_pos;}public int getPointY(){return y_pos;}public MousePanel(){addMouseListener(new MouseListener(){//mouseClicked():鼠标单击public void mouseClicked(MouseEvent e){x_pos=e.getX();y_pos=e.getY();repaint();}//mouseEntered():鼠标进入时public void mouseEntered(MouseEvent e){}//mouseExited():鼠标离开时public void mouseExited(MouseEvent e){}//mousePressed():鼠标按下去public void mousePressed(MouseEvent e){}//mouseReleased():鼠标松开时public void mouseReleased(MouseEvent e) {}});addMouseMotionListener(new MouseMotionListener(){public void mouseMoved(MouseEvent e){}public void mouseDragged(MouseEvent e){}});}public void paintComponent(Graphics g){super.paintComponent(g);//g.drawString("current location is:["+x_pos+","+y_pos+"]",x_pos,y_pos);//在界面上显示//System.out.printf("current location is:["+x_pos+","+y_pos+"]\n",x_pos,y_pos);//在控制台显示        g.setColor(Color.RED);g.drawRect(x_pos-25, y_pos-25, 50, 50);//g.fillOval(x_pos,y_pos,8,8);}
}
import java.io.File;
import java.util.ArrayList;public class FileTool {public static ArrayList<String> refreshFileList(String strPath) { ArrayList<String> filelist = new ArrayList<String>(); File dir = new File(strPath); File[] files = dir.listFiles(); if (files == null) {return filelist; }for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { refreshFileList(files[i].getAbsolutePath()); } else{ String strFileName = files[i].getAbsolutePath().toLowerCase(); //System.out.println(strFileName); filelist.add(files[i].getAbsolutePath());                    } }return filelist;}public static void main(String[] args) {// TODO Auto-generated method stubArrayList<String>  test = refreshFileList("/home/linger/imdata/collar");System.out.println(test.get(668));System.out.println(test.get(669));System.out.println(test.get(670));}}

用java的swing写了个图片标注工具相关推荐

  1. python图像标记工具怎么用_图片标注工具LabelImg使用教程

    1.进入labelImg-master文件夹,在空白处使用 "Shift+鼠标右键" ,选择在此处打开命令窗口,依次输入下面语句即可打开软件. pyrcc4 -o resource ...

  2. 图片标注工具 LabelImg 使用教程

    转自:http://blog.csdn.net/jesse_mx/article/details/53606897 作者:Jesse_Mx ------------------------------ ...

  3. 图片标注工具LabelImg的安装及使用方法

    项目地址:LabelImg  下载地址:Windows/Linux  百度云备份:最近几个版本 密码: cnn6 前言 我们知道,图片标注主要是用来创建自己的数据集,方便进行深度学习训练.本篇博客将推 ...

  4. 图片标注工具LabelImg的简单安装

    前言 最近要用到图片标注工具LabelImg来创建导师的数据集,方便进行 深度学习训练.这款工具是全图形界面,用Python和Qt写的,最牛的是其标注信息可以直接转化成为XML文件,与PASCAL V ...

  5. CV之LabelImg:图片标注工具之LabelImg(图像标注工具)的简介、安装、使用方法详细攻略

    CV之LabelImg:图片标注工具之LabelImg(图像标注工具)的简介.安装.使用方法详细攻略 目录 LabelImg的简介 常见的图片标注工具 LabelImg trainingImageLa ...

  6. VOC数据集图片标注工具labelImg简介、安装、使用方法详细攻略(windows) PyQt4、PyQt5

    参考文章1:labelImg:图片标注工具之labelImg的简介.安装.使用方法详细攻略 参考文章2:LabelImg labelImg的安装 用gitbash打开,运行git clone http ...

  7. 使用 Java 的 Swing 写个王者荣耀攻略桌面应用(半成品)

    最近在整理之前写过的 JavaSE 代码,发现了很久以前写过的一个有趣的图形界面程序,本来试着去做一个王者荣耀助手的,发现需要太多的素材了,且基于Swing写界面远不如使用 html.css 等以网页 ...

  8. Java 上传图片至OSS并返回图片地址工具类可直接用

    OSS上传图片并返回图片地址工具类 OSS上传图片并且返回地址工具类 可以直接拿去用 后续会继续更新 需要注意的点: 下面代码里的@Value里的几个值我是放在application.yml文件里的, ...

  9. 【问题记录】labelImg:一款实用图片标注工具的安装和使用

    前言 labelImg是一个实用的图片标注软件,可以用于数据集的制作.标注等等,它的使用需要以下库的支持:PyQt5.PyQt5_tools.lxml.下面介绍labelImg的安装过程. 安装方法: ...

最新文章

  1. Django项目日志概述
  2. 基于深度学习的医学图像半监督分割
  3. 独家 | ​PyMC3 介绍:用于概率编程的Python包
  4. WebService重载问题
  5. php js实现异步图片上传,使用php+js异步上传图片
  6. HDU 2037 今年暑假不AC【贪心】
  7. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)
  8. BS Model in option
  9. paging in linux,Linux Operating System
  10. 【活动(北京)】Global Azure Bootcamp
  11. dataguard从库数据库丢失恢复例子(模拟所有的控制文件)
  12. sqlite3修改表内容python_Python sqlite3数据库模块使用攻略
  13. Ajax 和 PHP 实现验证码的实时验证
  14. 微软原生 Notepad 融入 VS Code 才是出路?
  15. 关于SVN提交注释的问题
  16. 计算机设备运输规范,《电子计算机机房设计规范》GB50174-93
  17. EPS中编写第一个程序
  18. SVN服务器端安装教程
  19. python乱码怎么办_python中urllib.unquote乱码的原因与解决方法
  20. 技术人员的等级划分和资质要求

热门文章

  1. ImageNet数据集简介与下载详细步骤
  2. conda报错:因为动了mata site packages
  3. 如何添加linux文件系统,技术|如何在Linux上添加或编辑文件系统的卷标
  4. ChatGPT热中的冷思考
  5. 一个网上在线密码破解网站
  6. js插件chosen-select后台交互下拉框选择
  7. Graph Neural Networks: Graph Structure Learning
  8. Spark3-AQE-数据倾斜Join优化
  9. 使用node+puppeteer破解验证码
  10. height:100%和height:inherit比较