JAVA屏幕截图与水印添加程序-HEHEHEScreenshot
为什么80%的码农都做不了架构师?>>>
原贴发表在我的个人博客haha.tk | Ha?Have a Talk!上,转载请注明出处,谢谢。
一切都源于这个表情,后面这个表情就以不可预料的情况演化了。那时想着做一个能加苍蝇的截图工具,程序是用JAVA实现的,项目托管在GitHub https://github.com/Bigcaitou/HEHEHEScreenshot
talk is cheap, show you the code.
截取屏幕
public RectD() {snapshot();setVisible(true);// setSize(d);//最大化窗口//用 JDialog 做一个无控制条的窗口,大小设置成满屏,把截取的这个满屏的图片贴到这个 JDiaglog 里setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.addMouseListener(new MouseAdapter() {// 得到鼠标箭头初始坐标@Overridepublic void mousePressed(MouseEvent e) {orgx = e.getX();orgy = e.getY();}});//鼠标圈定区域, 对圈定的区域截屏this.addMouseMotionListener(new MouseMotionAdapter() {@Overridepublic void mouseDragged(MouseEvent e) {endx = e.getX();endy = e.getY();g = getGraphics();g.drawImage(tempImage, 0, 0, RectD.this);int x = Math.min(orgx, endx);int y = Math.min(orgy, endy);int width = Math.abs(endx - orgx) + 1;int height = Math.abs(endy - orgy) + 1;// 加上1,防止width或height为0g.setColor(Color.BLUE);g.drawRect(x - 1, y - 1, width + 1, height + 1);// 减1,加1都是为了防止图片将矩形框覆盖掉saveImage = image.getSubimage(x, y, width, height);g.drawImage(saveImage, x, y, RectD.this);}});//双击鼠标截图this.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {int clickTimes = e.getClickCount();if (clickTimes == 2) {saveToFile();}}});}
public void snapshot() {try {Robot robot = new Robot();Dimension d = Toolkit.getDefaultToolkit().getScreenSize();image = robot.createScreenCapture(new Rectangle(0, 0, d.width, d.height));} catch (AWTException e) {e.printStackTrace();}}
利用Robot的createScreenCapture可以截图,但是有个问题是遇到多个屏幕,这个方法只能在默认屏幕截图。
添加苍蝇
public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree) {OutputStream os = null;try {Image srcImg = ImageIO.read(new File(srcImgPath));BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),BufferedImage.TYPE_INT_RGB);// 得到画笔对象Graphics2D g = buffImg.createGraphics();// 设置对线段的锯齿状边缘处理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0,0, null);if (null != degree) {// 设置水印旋转g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);}// 水印图象的路径 水印一般为gif或者png的,这样可设置透明度ImageIcon imgIcon = new ImageIcon(iconPath);// ImageIcon imgIcon = new ImageIcon(iconPath);// 得到Image对象。Image img = imgIcon.getImage();float alpha = 1f;// 透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));// 表示水印图片的位置g.drawImage(img, 50, 50, null);g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));g.dispose();os = new FileOutputStream(targerPath);// 生成图片ImageIO.write(buffImg, "PNG", os);setClipboardImage(buffImg);} catch (Exception e) {e.printStackTrace();} finally {try {if (null != os)os.close();} catch (Exception e) {e.printStackTrace();}}}
苍蝇的大小要合适,太大的话太假,太小的话素材太难抠了,最后苍蝇素材是从一个苍蝇画刷工具而来的,我还找了会PS的同学帮我画上苍蝇腿。
截图复制到剪贴板
public static void setClipboardImage(final Image image) {Transferable trans = new Transferable() {public DataFlavor[] getTransferDataFlavors() {return new DataFlavor[] { DataFlavor.imageFlavor };}public boolean isDataFlavorSupported(DataFlavor flavor) {return DataFlavor.imageFlavor.equals(flavor);}public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {if (isDataFlavorSupported(flavor))return image;throw new UnsupportedFlavorException(flavor);}};Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);}
系统托盘
public static class SystemTrayDemo extends JFrame {private static final long serialVersionUID = 1L;private TrayIcon trayIcon = null;public SystemTrayDemo() {if (SystemTray.isSupported()) {// 检查当前系统是否支持系统托盘SystemTray tray = SystemTray.getSystemTray();// 获取表示桌面托盘区的SystemTray实例。Image image = this.getToolkit().getImage(this.getClass().getResource("/image/logo.png"));PopupMenu popupMenu = new PopupMenu();MenuItem exitItem = new MenuItem("退出");MenuItem menuItema = new MenuItem("截图");exitItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {System.exit(0);} catch (Exception ex) {ex.printStackTrace();}}});popupMenu.add(menuItema);popupMenu.add(exitItem);trayIcon = new TrayIcon(image, "呵呵呵截图", popupMenu);while (flag) {flag = false;menuItema.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 这里调用截图功能RectD rd = new RectD();GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();gd.setFullScreenWindow(rd);}});try {tray.add(trayIcon);// 将 TrayIcon 添加到 SystemTray。} catch (AWTException e) {System.err.println(e);}}} else {System.out.println("你的系统不支持系统托盘");}try {} catch (Exception e) {}}}
可能会遇到托盘乱码,可以参考 《java软件托盘MenuItem 显示中文出现框框乱码、读取ini配置文件乱码》 ,来解决问题。
保存图片
public void saveToFile() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_");String name = sdf.format(new Date());File path = FileSystemView.getFileSystemView().getHomeDirectory();// 图片保存在桌面String format = "png";File f = new File(path + File.separator + name + "." + format);try {ImageIO.write(saveImage, format, f);String srcImgPath = path + "\\" + name + ".png";String iconPath = System.getProperty("user.dir") + "\\1.png";// URL iconPath = this.getClass().getResource("/image/1.png");String targerPath = path + "\\" + name + "呵呵呵.png";this.dispose();//给图片添加水印HEHEHEScreenshot.markImageByIcon(iconPath, srcImgPath, targerPath, null);} catch (IOException e) {e.printStackTrace();}}
效果图如下所示:
相关链接
|相关链接 | |:-------------:| | 苍蝇画刷工具下载 | | 项目主页 | | java 截图源码 | | Java实现给图片添加水印 | | java软件托盘MenuItem 显示中文出现框框乱码、读取ini配置文件乱码 |
下次再讲
- jar的运行
- jar→exe
- jre精简
- 跨平台优化
转载于:https://my.oschina.net/thau/blog/672638
JAVA屏幕截图与水印添加程序-HEHEHEScreenshot相关推荐
- 简单几行代码,教你在Aspose.words中使用 Java 将水印添加到 Word 文档
Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此 ...
- Java 在PPT中添加文本水印的简易方法(单一/平铺水印)
[前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...
- Java后台开发Tomcat添加https支持小程序开发过程
文章原文:blog.ouyangsihai.cn >> Java后台开发Tomcat添加https支持小程序开发过程 1 给自己的域名申请证书 注意:申请好了如果不是在腾讯注册的域名,不会 ...
- Java分享--给图片添加文字水印(文字可旋转)
这篇文章主要介绍了Java实现给图片添加文字水印,文字水印的方法,涉及java针对图片的读取.水印添加设置等相关操作技巧,需要的朋友可以参考下 . 很多时候项目中的图片需要一定的版权,就是人家拿出去用 ...
- java 添加水印 清除水印
在学生时代便实现java打水印的程序,现在工作却找不到曾经写的代码,记录下来方便以后使用. 先谈谈需求: ①一张图片可以被多张logo打水印,但一张图片只能打一个水印,避免重复水印. ②支持清除本地图 ...
- java写exe程序实例,java实现可安装的exe程序实例详解
java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...
- JAVA基础复习1:开始Java世界的第一个程序
之前,我已经安装好了Java,并且设置好了Java配置.那么来写一段进入Java世界的第一个程序. 1.打开记事本(曾经看过廖大神的一个博客,说是不建议使用Windows自带的记事本,因为有时候会添加 ...
- 世界java大神有哪些_JAVA基础复习1:开始Java世界的第一个程序
之前,我已经安装好了Java,并且设置好了Java配置.那么来写一段进入Java世界的第一个程序. 1.打开记事本(曾经看过廖大神的一个博客,说是不建议使用Windows自带的记事本,因为有时候会添加 ...
- mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB
mongodb连接java 在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对 ...
- 如何从Java EE无状态应用程序连接到MongoDB
在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对MongoDB执行操作,则可 ...
最新文章
- 字符串拼接还在用StringBuilder?快试试Java8中的StringJoiner吧,真香!
- poj 1699 Best Sequence (搜索技巧 剪枝 dfs)
- 安卓期末项目源码_手机随时随地写Python,还可以开发安卓APP,太厉害了!
- html怎么用小小的图片铺满作为背景,多种背景图片随机切换的应用
- C#编程(十九)----------部分类
- debian8.4安装sqliteman总结
- VUE常用插件库总结
- 二叉树的中序遍历算法
- wincc c 语言改颜色,wincc常用c脚本小草设置
- 腾讯云下centos git 克隆远程仓库
- Tesla T4 在Ubuntu18.04上的安装使用
- 高级前端面试题(来自一位朋友的投稿哟)
- 「化学」相对分子质量
- 什么是安全测试?一文教会你如何开展系统安全测试…
- 在EXCEL下用VBA编程提高人事数据的管理效率
- linux 读卡器信息,Linux如何使用笔记本自带的SD/MMC读卡器
- 大学毕业4年-未来展望(1)-商业研究
- for循环--下标越界导致死循环原因
- 【ARM】ARM体系与计算机组成——第一篇
- 机器学习-33-Anomaly Detection(异常侦测)