吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 812|回复: 13
收起左侧

[Java 原创] java跨平台截图上传工具

  [复制链接]
wangping52p 发表于 2024-12-12 11:26
本帖最后由 wangping52p 于 2024-12-12 11:29 编辑

以下是用AI为我的项目写的简要介绍
一、程序功能概述
这个 Java 程序主要实现了两个核心功能,一是进行屏幕截图操作,二是可选择将截图文件上传至指定的目标机器。整体功能旨在方便用户快速抓取当前屏幕画面,并能按需分享给其他机器以便进行诸如问题上报、远程协作展示等相关应用场景。

二、功能详细介绍
  • 屏幕截图功能
    • 程序首先会获取本地机器的主机名,通过InetAddress.getLocalHost().getHostName()语句实现,以此来作为后续截图文件名的一部分,便于区分不同机器所截取的图片。
    • 接着利用SimpleDateFormat按照指定格式(yyyyMMddHHmmss)获取当前时间,并将其也融入到文件名当中,确保文件名的唯一性。
    • 之后通过System.getProperty("user.home")获取用户的主目录路径,拼接出桌面路径下 “问题上报” 文件夹的完整路径,用于存放即将生成的截图文件。
    • 创建Robot类的实例,结合获取到的屏幕尺寸(借助Toolkit.getDefaultToolkit().getScreenSize())构建出对应的矩形区域,从而调用createScreenCapture方法实现抓取整个屏幕的截图,并将其保存为 PNG 格式的图片文件到上述指定的文件夹路径下。
  • 截图上传功能(可选)
    • 程序支持接收命令行参数,参数即为目标机器名。如果在运行程序时传入了目标机器名参数,那么程序会利用Runtime.getRuntime().exec执行SCP(Secure Copy Protocol,安全复制协议)命令,尝试将刚刚保存好的本地截图文件上传到指定目标机器的桌面 “问题上报” 文件夹中。
    • 在执行SCP命令的过程中,会读取命令执行产生的错误流信息,方便排查可能出现的上传失败原因,同时根据进程的返回码(exitCode)判断上传操作是否成功,并输出相应的提示信息告知用户上传结果,比如提示截图成功上传到某机器桌面或者上传到某机器失败等。若没有传入目标机器名参数,则会输出提示信息表明不进行上传操作。

三、使用场景示例
  • 故障排查与上报:当电脑出现一些软件故障、显示问题等情况时,用户可以运行该程序快速截取屏幕画面,然后指定技术支持人员所在的目标机器,将截图上传过去,方便技术人员直观地查看问题现象,有助于快速诊断和解决问题。
  • 远程协作与沟通:在远程协作项目中,一方可以截取屏幕内容并上传给其他合作成员,让对方更清晰地了解自己这边的操作情况、项目进展展示等内容,提升沟通协作的效率。
四、注意事项
  • 在执行上传功能时,需要确保本地机器与目标机器之间已经配置好了合适的网络连接以及必要的权限设置,比如配置好SSH免密登录或者能够正确输入密码进行认证等相关操作,否则SCP命令无法成功执行,导致截图上传失败。
  • 若对程序功能进行扩展或者修改,例如改变截图保存的格式、调整文件存放路径等,需要对代码中相应的逻辑部分进行仔细调整,确保程序的稳定性和正确性。
    下面附上源码
五、源码及编译打包实现过程
  • 首先项目使用vscode创建一个ScreenCapture.java文件
  • 复制粘贴以下代码
  • [Java] 纯文本查看 复制代码
    import java.awt.AWTException;
    import java.awt.Dimension;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetAddress;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import javax.imageio.ImageIO;
    
    public class ScreenCapture {
        public static void main(String[] args) {
            try {
                // 获取系统机器名
                String hostName = InetAddress.getLocalHost().getHostName();
    
                // 获取当前时间,并格式化为字符串
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                String currentTime = sdf.format(new Date());
    
                // 拼接文件名
                String fileName = hostName + "_" + currentTime + ".png";
    
                // 获取桌面路径(跨平台)
                String desktopPath = System.getProperty("user.home");
                desktopPath += "/Desktop/问题上报/";
    
                // 创建文件对象
                File outputfile = new File(desktopPath, fileName);
    
                // 创建 Robot 实例
                Robot robot = new Robot();
    
                // 获取屏幕尺寸
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                Rectangle screenRect = new Rectangle(screenSize);
    
                // 抓取屏幕截图
                BufferedImage screenFullImage = robot.createScreenCapture(screenRect);
    
                // 将截图保存为 PNG 文件
                ImageIO.write(screenFullImage, "png", outputfile);
    
                System.out.println("屏幕截图已保存为 " + outputfile.getAbsolutePath());
    
                // 根据传入参数个数决定上传操作
                if (args.length >= 1) {
                    for (int i = 0; i < args.length; i++) {
                        String targetHostName = args[i];
                        // 构建 SCP 命令
                        String scpCommand = "scp " + outputfile.getAbsolutePath() + " " + targetHostName + ":~/Desktop/问题上报/";
                        System.out.println("执行的 SCP 命令(机器 " + (i + 1) + "):" + scpCommand);
                        Process process = Runtime.getRuntime().exec(scpCommand);
    
                        // 读取错误流,以便查看错误信息
                        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                        String line;
                        while ((line = errorReader.readLine())!= null) {
                            System.err.println("SCP 错误信息(机器 " + (i + 1) + "):" + line);
                        }
                        errorReader.close();
    
                        int exitCode = process.waitFor();
                        if (exitCode == 0) {
                            System.out.println("截图成功上传到 " + targetHostName + " 的桌面。");
                        } else {
                            System.err.println("上传截图到 " + targetHostName + " 失败。");
                        }
                    }
                } else {
                    System.out.println("未指定目标机器名,不进行上传操作。");
                }
    
            } catch (AWTException | IOException | InterruptedException ex) {
                System.err.println("截图或上传失败: " + ex.getMessage());
            }
        }
    }
  • 编译java文件使用命令javac -encoding UTF-8 ScreenCapture.java
  • 在编译完的class文件所在目录下创建清单文件MANIFEST.MF
  • 输入如下内容
    [Asm] 纯文本查看 复制代码
    Manifest-Version: 1.0
    Main-Class: ScreenCapture
  • 编译完执行打包命令打包为jar包[color=var(--md-box-samantha-normal-text-color)]jar cvfm ScreenCapture.jar MANIFEST.MF  ScreenCapture.class
  • [color=var(--md-box-samantha-normal-text-color)]这样一个完整的可以跨平台运行的jar包就可以运行了,对应生成文件的路径可以先创建
六、运行 Jar 包(可选验证步骤)

    • 运行命令(不传参情况):在终端中输入java -jar ScreenCapture.jar命令并回车,按照代码逻辑,如果没有传参,会执行截图并保存到本地桌面 “问题上报” 文件夹的操作,同时终端会输出相应的提示信息,比如提示截图已保存等内容。
    • 运行命令(传参情况,可选测试):如果要测试传入参数(上传截图到指定机器的情况),例如传入一个目标机器名targetMachine1,就在终端中输入java -jar ScreenCapture.jar targetMachine1命令并回车,这时会先完成截图保存本地的操作,然后尝试通过SCP命令上传截图到指定的机器上,并输出相应的操作结果提示信息,比如上传成功或失败等提示。

    [color=var(--md-box-samantha-normal-text-color) !important]
    通过以上步骤,你就可以在 VS Code 中完成对ScreenCapture这个 Java 类从编译到打成 Jar 包以及简单的运行测试操作了,在实际应用中,如果遇到问题(比如编译错误、运行时异常等),可以根据 VS Code 给出的提示信息进一步排查解决。


这个项目虽然简单,但非常实用,可以集成到日常使用的运维脚本中
DESKTOP-OFG5250_20241212112248.png

运行效果截图

运行效果截图

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

1e3e 发表于 2024-12-17 15:53
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-8u372-ga~us1-0kylin1~20.04-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)
运行不了,$ java -jar ScreenCapture.jar
java.io.FileNotFoundException: /home/q9/Desktop/问题上报/q9-pc_20241217155020.png (没有那个文件或目录)
        at java.io.RandomAccessFile.open0(Native Method)
        at java.io.RandomAccessFile.open(RandomAccessFile.java:316)
        at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
        at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:69)
        at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:55)
        at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419)
        at javax.imageio.ImageIO.write(ImageIO.java:1543)
        at ScreenCapture.main(ScreenCapture.java:47)
截图或上传失败: Can't create an ImageOutputStream!
 楼主| wangping52p 发表于 2024-12-12 18:58
rhci 发表于 2024-12-12 15:07
其实可以做成pythen或者ahk脚本,使用ftp或者ftpd来进行传输,也可以做成可执行文件。

跨平台支持上,java只需要jdk8版本库就可以实现截图,python普遍需要第三方库,某些内网特殊系统上很难实现,做成jar包更好,一处打包出处运行,支持性更广,python即使支持源码跨平台,但打包是不支持的
rhci 发表于 2024-12-12 15:07
其实可以做成pythen或者ahk脚本,使用ftp或者ftpd来进行传输,也可以做成可执行文件。
jinghuasy001 发表于 2024-12-12 16:24
感谢楼主分享
头像被屏蔽
pomxion 发表于 2024-12-12 16:50
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽
pomxion 发表于 2024-12-12 17:52
提示: 作者被禁止或删除 内容自动屏蔽
fanliansuo1 发表于 2024-12-12 17:52
谢谢分享
enze999 发表于 2024-12-12 18:07
感谢分享!!!
446873187 发表于 2024-12-12 20:27
我来试试看,能不能跑
rhci 发表于 2024-12-13 08:44
wangping52p 发表于 2024-12-12 18:58
跨平台支持上,java只需要jdk8版本库就可以实现截图,python普遍需要第三方库,某些内网特殊系统上很难实 ...

好吧,我还真没注意是跨平台了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-6 06:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表