将使用 curl 检索的图像通过管道传输到 sips 以更改格式而不保存中间文件
我有要从互联网上检索的图像文件的 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 做得非常好),因为文件上没有文件扩展名。
我没有安装 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 将成为目录中唯一没有临时文件的文件
显然
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
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 和文件描述符