感觉做的还不错,给大家分享下,要是改进下是不是可以和QQ截图媲美了。 程序截图
原创不易, 转载请注明出处:分享一个在osc上看到的java版的截图软件
package com.zuidaima.image.capture; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*; import javax.swing.*; public class Screenshot extends JFrame implements MouseMotionListener, MouseListener { private static final long serialVersionUID = 1L; private BufferedImage buff_img; private Robot robot; private JLabel label; private Point start; private Point end; private int x, y, width, height; private boolean over = false; private JLabel show_sub; private CaptureScreen captureScreen; private ImageIcon icon; private SubImgAction subAction; private JFrame ss = this; class SubImgAction implements MouseListener, MouseMotionListener { private JLabel label; private int x; private int y; private BufferedImage image; private ImageIcon icon; public SubImgAction(JLabel label, BufferedImage image, ImageIcon icon) { this.label = label; this.image = image; this.icon = icon; } @Override public void mouseDragged(MouseEvent e) { Point dragPoint = e.getPoint(); SwingUtilities.convertPointToScreen(dragPoint, label); icon.setImage(image.getSubimage(dragPoint.x - x < 0 ? 0 : dragPoint.x - x, dragPoint.y - y < 0 ? 0 : dragPoint.y - y, label.getWidth(), label.getHeight())); label.setLocation(dragPoint.x - x, dragPoint.y - y); } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == 1 && e.getClickCount() == 2) { new ClipboardUtil().writeToClipboard(image.getSubimage( label.getX(), label.getY(), label.getWidth(), label.getHeight())); ss.dispose(); JOptionPane.showMessageDialog(ss, "指定区域屏幕已复制到剪贴板!"); captureScreen.setVisible(true); } else if (e.getButton() == 3) { ss.dispose(); captureScreen.setVisible(true); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { if (e.getButton() == 3) { ss.dispose(); captureScreen.setVisible(true); } Point clickPoint = new Point(e.getPoint()); SwingUtilities.convertPointToScreen(clickPoint, label); x = clickPoint.x - label.getX(); y = clickPoint.y - label.getY(); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } public Screenshot(CaptureScreen captureScreen) { this.setLayout(null); this.captureScreen = captureScreen; icon = new ImageIcon(); this.setSize(ScreanSizeUtil.getDimension()); setUndecorated(true); setExtendedState(MAXIMIZED_BOTH); setResizable(false);// 设置不可改变大小 setAlwaysOnTop(true);// 设置总是在顶层(最上层) start = new Point(); end = new Point(); label = new JLabel(); show_sub = new JLabel(); show_sub.setIcon(icon); add(show_sub); try { robot = new Robot(); buff_img = robot.createScreenCapture(new Rectangle(0, 0, ScreanSizeUtil.getDimension().width, ScreanSizeUtil .getDimension().height));// 获得整个屏幕 subAction = new SubImgAction(show_sub, buff_img, icon); show_sub.addMouseListener(subAction); show_sub.addMouseMotionListener(subAction); show_sub.setBorder(BorderFactory.createLineBorder(Color.RED, 2)); label = new JLabel() { private static final long serialVersionUID = 1L; protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(buff_img, 0, 0, this); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(new Color(150, 150, 150)); AlphaComposite composite = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 60 / 100.0F); g2d.setComposite(composite); g2d.fill(new RoundRectangle2D.Float(0, 0, this.getWidth(), this.getHeight(), 0, 0)); } }; label.setBounds(0, 0, getWidth(), this.getHeight()); add(label); } catch (AWTException e) { e.printStackTrace(); } setVisible(true); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } robot.createScreenCapture(new Rectangle(0, 0, ScreanSizeUtil .getDimension().width, ScreanSizeUtil.getDimension().height)); addMouseListener(this); addMouseMotionListener(this); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { start.x = e.getX(); start.y = e.getY(); } @Override public void mouseReleased(MouseEvent e) { over = true; } @Override public void mouseDragged(MouseEvent e) { if (!over) { end.x = e.getX(); end.y = e.getY(); x = Math.min(start.x, end.x); y = Math.min(start.y, end.y); width = Math.abs(end.x - start.x); height = Math.abs(end.y - start.y); if (width == 0 || height == 0) return; icon.setImage(buff_img.getSubimage(x, y, width, height)); show_sub.setBounds(x, y, width, height); // repaint(); } } @Override public void mouseMoved(MouseEvent e) { end.x = e.getX(); end.y = e.getY(); // repaint(); } }
代码下载地址:http://www.zuidaima.com/share/1550463293164544.htm
相关推荐
**标题解析:** "OSC.zip_osc" 这个标题暗示了我们正在处理一个与OSC(Open Sound Control)相关的程序或库,它被压缩在名为"OSC.zip"的文件中。OSC是一种通信协议,常用于实时互动软件,如音乐、视觉艺术和多媒体...
Git 是一个分布式版本控制系统,允许开发者在本地机器上存储和管理代码的历史版本记录。Git 的主要特点是分布式、非线性、离线提交和高性能。 使用 Git@OSC 需要安装 Git 软件,下载最新版本的 Git 可以从官方网站...
例如,如果一个OSC消息表示模型的旋转,单位可能是弧度或度,需要在发送时明确指定。 **插件的使用** 在标签中提到了“插件”,这可能是指在PC端需要安装支持OSC协议的插件或者扩展,以便接收和处理来自平板的控制...
Clojure是一种基于Lisp的函数式编程语言,运行在Java平台上,因此这个库很可能提供了与Java的JNI接口或者其他Java库的交互方式。 Clojure的OSC库可能包括以下组件: 1. **地址解析**: 解析和构造OSC地址路径,支持...
CTUPAY则是针对OSC设计的一款收费插件,它为OSC增加了对特定支付方式的支持,使得用户能够在购物过程中更方便地进行支付。 CTUPAY插件的主要功能在于整合了多种支付网关,特别是针对一些国际和本地的支付方式,为...
2. OSC802 V3.10.0 虚拟示波器:此软件相当于在计算机上构建了一个虚拟的示波器面板,用户可以通过鼠标和键盘进行各种操作,如调整通道增益、设置时间基、选择触发模式等。虚拟示波器通常具有更高的灵活性,允许用户...
4. **设置OSC服务器和客户端**:在Unity中,开发者需要配置一个服务器来监听特定端口的OSC消息,同时在需要发送数据的客户端上创建OSC客户端,指定服务器的IP地址和端口号。 5. **数据传输**:通过OSC,你可以发送...
** osc.rar_osc原理_示波器 ** ...总结来说,"osc.rar_osc原理_示波器"的资源包提供了理解示波器工作原理和操作虚拟示波器的机会,无论是在学术研究还是工程实践中,都是学习和应用示波器技术的一个宝贵工具。
Ventuz.OSC是一个关于Ventuz软件与Open Sound Control (OSC)协议交互的工具或库。Ventuz是一款强大的3D图形和交互式内容创作平台,常用于电视广播、虚拟现实、展览展示等领域。而OSC是一种通信协议,专为多媒体应用...
OSC是一种用于在不同设备间传递控制信息的标准协议,尤其适用于音频和视频合成器以及多媒体应用。Quest3D提供的OSC插件允许用户轻松地集成外部OSC数据流到Quest3D项目中。 #### 二、OSC Reader 插件详解 ##### 1. ...
本文将深入探讨一个名为"osc-placement"的Python库,版本为1.5.0,它被封装在一个名为"osc-placement-1.5.0.tar.gz"的压缩包中。这个库主要用于处理OpenStack中的资源分配和定位问题,对于理解和操作OpenStack环境...
在这款OSC测试工具中,OpenGL被用来创建一个交互式的可视化环境,帮助用户直观地观察和分析OSC数据流。通过OpenGL,工具可以显示 OSC 消息的传输路径和接收状态,使得问题定位更为直观和高效。 **OSC协议核心概念**...
python-osc是Python的一个开源库,用于处理OSC消息。它提供了创建、发送和接收OSC包的能力,使得Python开发者能够轻松地与支持OSC的硬件或软件进行交互。版本1.4.1是对该库的稳定更新,包含了一些优化和可能的bug...
"JAVA 示例波器"指的是一个用Java语言编写的示波器软件,它可能是用于可视化模拟或数字信号的工具,常见于电子工程和计算机科学领域。"Processing Arduino"表明这个项目可能整合了Processing编程环境和Arduino硬件,...
unity3D中对OSC以及TUIO通讯的插件。
标题中的"OSC.rar_it_osc"表明这是一个与OSC(可能是Oscillator,振荡器)相关的项目,且文件被压缩在名为"OSC.rar"的文件中。"it"可能指的是信息技术或者互连技术,而"Verilog for MaxV"则表示这个项目是用Verilog硬件...
- 分析日志确定事务的执行次序,结合pt-osc工作原理,可以发现死锁可能源于在拷贝最后一个chunk-size时,新插入的事务尝试获取auto-inc lock,而pt-osc正在等待这个锁。 5. **优化方案**: - 调整chunk-size,...
【标题】"WIn_OSC_4.43.zip" 是LG公司提供的一个显示器屏幕控制软件的压缩包,版本号为4.43。这款软件专为Windows操作系统设计,旨在帮助用户更方便、高效地管理和调整LG显示器的各项设置。 【描述】中提到的功能...
**"OSC Server Windows"** 指的是一个在Windows平台上运行的OSC服务器,该服务器能够接收并处理来自OSC客户端(例如iOS应用"Touch OSC")的命令和数据。LabVIEW中的这个VI允许用户构建一个自定义的OSC服务器,以便与...
- **Java**:在Java中,为了创建一个简单的数据模型类,需要手动添加getter和setter方法、`toString()`、`equals()`和`hashCode()`等方法。 - **Kotlin**:而在Kotlin中,只需声明一个DataClass即可自动生成这些...