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

icnyk63a  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(95)

我有url链接到图像文件,我想从互联网上检索。
我可以使用curl下载文件,而不会出现以下问题:

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

图像文件是各种类型的,一些.bmp一些.jpg等我一直在使用sip在Mac osx上的终端每个转换为.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或谷歌。
有没有一种方法可以直接在sips中处理使用curl下载的图像,而不需要先保存文件?
我不一定需要使用管道的解决方案,甚至不需要在一行上。我有一个脚本,它将循环通过几千个URL,只是想避免保存大量的文件,这些文件将在一行后被删除。
我应该补充一点,我也不一定需要使用sips。但是,任何解决方案都必须能够处理未知类型的图像文件(sips做得令人钦佩),因为文件上没有文件扩展名。
谢谢

oiopk7p5

oiopk7p51#

我没有安装sips,但是its manpage表明它不能从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将成为目录中唯一没有临时文件的文件

bweufnob

bweufnob2#

显然,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

(首先通过brewinstall imagemagicksudoportinstall ImageMagick安装ImageMagick。)
ImageMagick允许使用伪文件名-分别从标准流STDIN(标准输入)和STDOUT(标准输出)读取和写入图像数据。
source,节 *STDIN、STDOUT和文件描述符 *

相关问题