You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Powershell截图后Write-Host输出字节数组过慢的优化方案问询

PowerShell截图输出耗时过长优化方案

核心问题原因

当前耗时的根源是Write-Host的错误使用:$memStream.ToArray()返回的是JPG文件的字节数组,Write-Host会将每个字节逐个转换为十进制字符串输出,单张普通截图就有几十万字节,逐字转换+输出自然会消耗数分钟时间。


方案1:优化现有PowerShell脚本

直接将二进制图片流写入标准输出,无需字符串转换,执行耗时可压缩到1秒以内,优化后的完整脚本如下:

Add-Type -AssemblyName System.Windows.Forms,System.Drawing

$screens = [Windows.Forms.Screen]::AllScreens

$top    = ($screens.Bounds.Top    | Measure-Object -Minimum).Minimum
$left   = ($screens.Bounds.Left   | Measure-Object -Minimum).Minimum
$width  = ($screens.Bounds.Right  | Measure-Object -Maximum).Maximum
$height = ($screens.Bounds.Bottom | Measure-Object -Maximum).Maximum

$bounds   = [Drawing.Rectangle]::FromLTRB($left, $top, $width, $height)
$bmp      = New-Object System.Drawing.Bitmap ([int]$bounds.width), ([int]$bounds.height)
$graphics = [Drawing.Graphics]::FromImage($bmp)

$graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)

$memStream = New-Object System.IO.MemoryStream

# 自定义JPG质量,80为画质和体积的平衡值,可按需调整
$jpgEncoder = [Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object { $_.FormatDescription -eq 'JPEG' }
$encoderParams = New-Object Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object Drawing.Imaging.EncoderParameter([Drawing.Imaging.Encoder]::Quality, 80L)
$bmp.Save($memStream, $jpgEncoder, $encoderParams)

# 直接输出二进制流到标准输出,替代低效的Write-Host
$stdout = [Console]::OpenStandardOutput()
$memStream.WriteTo($stdout)
$stdout.Close()

$graphics.Dispose()
$bmp.Dispose()
$memStream.Dispose()

注意:Java端接收输出时需直接读取标准输出的二进制流,不要按字符串编码解析,避免数据损坏。


方案2:Java原生实现截图(更推荐)

完全不需要调用外部PowerShell进程,没有进程通信开销,速度和稳定性更高,示例代码如下:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;

public class ScreenCapture {
    public static void main(String[] args) throws Exception {
        // 获取多屏总尺寸,适配多屏场景
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] screens = ge.getScreenDevices();
        Rectangle allScreenBounds = new Rectangle();
        for (GraphicsDevice screen : screens) {
            allScreenBounds = allScreenBounds.union(screen.getDefaultConfiguration().getBounds());
        }
        // 截图
        BufferedImage capture = new Robot().createScreenCapture(allScreenBounds);
        // 转JPG字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(capture, "jpg", baos);
        byte[] jpgBytes = baos.toByteArray();
        // 后续业务处理
    }
}

其他可选方案

如果有特殊场景需要使用外部工具,可选择以下更快的工具:

  • 用nircmd单命令截图,执行速度比PowerShell快30%以上
  • 用ffmpeg的gdigrab模块截图,支持自定义分辨率、画质等参数

内容的提问来源于stack exchange,提问作者Jakomo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:18:04