原贴发表在个人我的博客haha.tk | Ha?Have a Talk!上,转载请注明出处,谢谢。html
一切都源于这个表情,后面这个表情就以不可预料的状况演化了。那时想着作一个能加苍蝇的截图工具,程序是用JAVA实现的,项目托管在GitHub https://github.com/Bigcaitou/HEHEHEScreenshotjava
talk is cheap, show you the code.git
public RectD() { snapshot(); setVisible(true); // setSize(d);//最大化窗口 //用 JDialog 作一个无控制条的窗口,大小设置成满屏,把截取的这个满屏的图片贴到这个 JDiaglog 里 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.addMouseListener(new MouseAdapter() {// 获得鼠标箭头初始坐标 @Override public void mousePressed(MouseEvent e) { orgx = e.getX(); orgy = e.getY(); } }); //鼠标圈定区域, 对圈定的区域截屏 this.addMouseMotionListener(new MouseMotionAdapter() { @Override public 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为0 g.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() { @Override public 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能够截图,可是有个问题是遇到多个屏幕,这个方法只能在默认屏幕截图。github
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的同窗帮我画上苍蝇腿。ide
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配置文件乱码 |this
下次再讲.net
- jar的运行
- jar→exe
- jre精简
- 跨平台优化