将使用curl检索到的图像传送到sips以更改格式,而不保存中间文件

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

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

我可以使用

curl
下载文件,没有问题:

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

图像文件有多种类型,一些

.bmp
一些
.jpg
等。我一直在Mac osx上的终端中使用
sip
将每个文件转换为
.png
文件,使用:

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

无论起始文件类型如何,这都适用于我保存为

downloadedFileName
的文件。

由于我有很多文件要处理,我想将curl下载的输出直接通过管道传输到sips中,而不保存中间文件。

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

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

并收到无文件错误:

Error 4: no file was specified

我搜索了 sip 手册页,但找不到管道输入的参考,并且无法通过搜索 SO 或 google 找到有用的答案。

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

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

我应该补充一点,我也不一定需要使用 sips。然而,任何解决方案都必须能够处理未知类型的图像文件(sips 的表现令人钦佩),因为文件上不存在文件扩展名。

macos curl terminal pipe sips
2个回答
1
投票

我没有安装 sips,但是 它 manpage 表示无法读取 来自标准输入。但是,如果您使用 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 将成为 没有临时文件的目录


0
投票

显然

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 imagemagick
sudo
port
install ImageMagick
安装
ImageMagick
。)

ImageMagick 允许使用伪文件名 -. 分别从标准流 STDIN(标准输入)和 STDOUT(标准输出)读取和写入图像数据。

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

© www.soinside.com 2019 - 2024. All rights reserved.