为什么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相关推荐

  1. 简单几行代码,教你在Aspose.words中使用 Java 将水印添加到 Word 文档

    Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务.API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word.此 ...

  2. Java 在PPT中添加文本水印的简易方法(单一/平铺水印)

    [前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...

  3. Java后台开发Tomcat添加https支持小程序开发过程

    文章原文:blog.ouyangsihai.cn >> Java后台开发Tomcat添加https支持小程序开发过程 1 给自己的域名申请证书 注意:申请好了如果不是在腾讯注册的域名,不会 ...

  4. Java分享--给图片添加文字水印(文字可旋转)

    这篇文章主要介绍了Java实现给图片添加文字水印,文字水印的方法,涉及java针对图片的读取.水印添加设置等相关操作技巧,需要的朋友可以参考下 . 很多时候项目中的图片需要一定的版权,就是人家拿出去用 ...

  5. java 添加水印 清除水印

    在学生时代便实现java打水印的程序,现在工作却找不到曾经写的代码,记录下来方便以后使用. 先谈谈需求: ①一张图片可以被多张logo打水印,但一张图片只能打一个水印,避免重复水印. ②支持清除本地图 ...

  6. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

  7. JAVA基础复习1:开始Java世界的第一个程序

    之前,我已经安装好了Java,并且设置好了Java配置.那么来写一段进入Java世界的第一个程序. 1.打开记事本(曾经看过廖大神的一个博客,说是不建议使用Windows自带的记事本,因为有时候会添加 ...

  8. 世界java大神有哪些_JAVA基础复习1:开始Java世界的第一个程序

    之前,我已经安装好了Java,并且设置好了Java配置.那么来写一段进入Java世界的第一个程序. 1.打开记事本(曾经看过廖大神的一个博客,说是不建议使用Windows自带的记事本,因为有时候会添加 ...

  9. mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB

    mongodb连接java 在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对 ...

  10. 如何从Java EE无状态应用程序连接到MongoDB

    在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对MongoDB执行操作,则可 ...

最新文章

  1. 字符串拼接还在用StringBuilder?快试试Java8中的StringJoiner吧,真香!
  2. poj 1699 Best Sequence (搜索技巧 剪枝 dfs)
  3. 安卓期末项目源码_手机随时随地写Python,还可以开发安卓APP,太厉害了!
  4. html怎么用小小的图片铺满作为背景,多种背景图片随机切换的应用
  5. C#编程(十九)----------部分类
  6. debian8.4安装sqliteman总结
  7. VUE常用插件库总结
  8. 二叉树的中序遍历算法
  9. wincc c 语言改颜色,wincc常用c脚本小草设置
  10. 腾讯云下centos git 克隆远程仓库
  11. Tesla T4 在Ubuntu18.04上的安装使用
  12. 高级前端面试题(来自一位朋友的投稿哟)
  13. 「化学」相对分子质量
  14. 什么是安全测试?一文教会你如何开展系统安全测试…
  15. 在EXCEL下用VBA编程提高人事数据的管理效率
  16. linux 读卡器信息,Linux如何使用笔记本自带的SD/MMC读卡器
  17. 大学毕业4年-未来展望(1)-商业研究
  18. for循环--下标越界导致死循环原因
  19. 【ARM】ARM体系与计算机组成——第一篇
  20. 机器学习-33-Anomaly Detection(异常侦测)

热门文章

  1. php实现禁止缓存,高手莫来
  2. LE SHAN GIANT BUDDHA and LINGYUN TEMPLE
  3. MySQL主从复制 + Mycat实现读写分离
  4. eclipse编码方式、标签语言获取根目录
  5. 选课系统类图与数据结构图
  6. mongodb的分布式集群(4、分片和副本集的结合)
  7. 广东地下水资源摘录(早期版的)
  8. 【python】-- Django ModelForm
  9. Ubuntu命令大全(转载)
  10. Stack of js