开发者问题收集

将使用 curl 检索的图像通过管道传输到 sips 以更改格式而不保存中间文件

2022-04-18
528

我有要从互联网上检索的图像文件的 URL 链接。

我可以使用 curl 下载文件,使用方法如下:

curl "https://...web address..." > myfileName;

图像文件有多种类型,有些是 .bmp ,有些是 .jpg 等等。我在 Mac OSX 上的终端中使用 sip 将每个文件转换为 .png 文件,使用方法如下:

sips -s format png downloadFileName  --out newFileName.png

无论起始文件类型是什么,该方法对我保存为 downloadedFileName 的文件都很有效。

由于我要处理许多文件,因此我想将 curl 下载的输出直接传送到 sips,而不保存中间文件。

我尝试了以下操作(结合了我的两个工作步骤,没有中间文件name):

curl "https://...web address..." | sips -s format png  --out fileName.png

并收到无文件错误: 错误 4:未指定文件

我搜索了 sip 手册页,但找不到管道输入的参考,也无法在 SO 或谷歌上找到有用的答案。

有没有办法直接在 sips 中处理使用 curl 下载的图像,而无需先保存文件?

我不一定需要使用管道的解决方案,甚至不需要在一行上。我有一个脚本将循环遍历几千个 url,只是想避免保存大量将在一行后被删除的文件。

我应该补充一下,我也不一定需要使用 sips。但是,任何解决方案都必须能够处理未知类型的图像文件(sips 做得非常好),因为文件上没有文件扩展名。

2个回答

我没有安装 sips,但 其手册页 显示无法从 stdin 读取。但是,如果您使用 Bash 或 ZSH(现在是 MacOS 默认设置),则可以使用进程替换,在此示例中,我使用 convert ,它是 ImageMagick 的一部分,也可以转换不同的图像类型:

$ convert <(curl -s https://i.kym-cdn.com/entries/icons/mobile/000/018/012/this_is_fine.jpg) this_is_fine.png
$ file this_is_fine.png
this_is_fine.png: PNG image data, 800 x 450, 8-bit/color RGB, non-interlaced

执行此操作后,this_is_fine.png 将成为目录中唯一没有临时文件的文件

Arkadiusz Drabczyk
2022-04-18

显然 sips 仅读取常规文件,因此无法使用 /dev/stdin 或命名管道。

但是,可以使用成熟且功能丰富的 convert 命令:

$ curl -sL https://picsum.photos/200.jpg | convert - newFilename.png
$ file newFilename.png
newFilename.png: PNG image data, 200 x 200, 8-bit/color RGB, non-interlaced

(首先通过 brew install imagemagicksudo ImageMagick noreferrer"> port 安装 ImageMagick 。)

ImageMagick permits image data to be read and written from the standard streams STDIN (standard in) and STDOUT (standard out), respectively, using a pseudo-filename of -.

,部分 STDIN、STDOUT 和文件描述符

Knight Industries
2022-10-10