将内存流图像直接传递到 PowerShell 中的 ImageMagick 命令中

问题描述 投票:0回答:1

我想获取现有的内存流图像并将其直接传递到 ImageMagick 执行命令中,而不将文件物理保存到机器上。下面的代码给出了我想要实现的示例,但我收到以下错误。

我不想安装整个 ImageMagick 软件包并试图保持所需资源的占用空间非常小。

*我还希望能够将 ImageMagick 命令的输出再次保存回内存流中。目标是完全传递和使用内存流而不保存到机器

正在使用的文件:

ImageMagick 版本:

代码示例:

# Set running location
$Desktop = [Environment]::GetFolderPath("Desktop")
Set-Location "$Desktop\TestImageStream\Core"

# Take existing screnshot and pass as a memory stream
$memoryStream = New-Object System.IO.MemoryStream
$imageBytes = [System.IO.File]::ReadAllBytes("$PWD\TestScreenshot.png")
$memoryStream.Write($imageBytes, 0, $imageBytes.Length)
$memoryStream.Seek(0, 'Begin')

# ImageMagick execute command
.\magick.exe $memoryStream -fill rgb(0,0,0) -opaque rgb(113,113,113) -fuzz 96% TestScreenshotOutput.jpg

# Cleanup
$memoryStream.Dispose()

错误:

magick.exe: UnableToOpenBlob 'System.IO.MemoryStream': No such file or directory @ error/blob.c/OpenBlob/3569

magick.exe: NoDecodeDelegateForThisImageFormat `MEMORYSTREAM' @ error/constitute.c/ReadImage/746.
windows powershell imagemagick memorystream
1个回答
0
投票

我知道你问的是 IM,但是 libvips 可以做你想做的事(真正的图像流)。例如:

cat k2.jpg | vips flip stdin .png horizontal | cat >x.png

这是linux,但它也可以在win 上运行。

该命令使用

cat
将 JPG 文件作为字节流通过管道发送到
vips
可执行文件的标准输入。
vips
exe 正在使用
flip
标志运行
horizontal
操作,从 stdin 读取并写入 stdout 上的 PNG 格式(通过在扩展名之前不使用文件名来启用)。最后一个
cat
命令是将字节流发送到磁盘上的文件。

文件永远不会完全加载到内存中。相反,它将以一组小像素块的形式从源流式传输到目的地。如果您有多个 CPU 核心,则会并行评估像素块,以实现有用的加速。即使对于非常大的图像(例如 500,000 x 500,000 像素),内存使用率也很低。

我认为你的困难在于翻译那些 magick 命令标志。 vips CLI 非常基础,实现模糊和填充会很痛苦。您最好使用 libvips 的 .net 绑定 并在那里编写命令。 .net 绑定具有相同的流媒体、速度(可能比 magick.net 快 20 倍)和低内存使用等良好特性。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.