【问题标题】:Piping Image stream to command line programs in Bash将图像流管道传输到 Bash 中的命令行程序
【发布时间】:2017-05-22 07:08:25
【问题描述】:

我正在尝试将 JPEG 文件从 Image Magik 的“转换”传输到其他命令行程序以进行基准测试。有没有办法强制没有内置功能的程序从管道读取而不是从磁盘读取文件?

具有这种内置功能的程序示例是“CJPEG”:

convert INFILE.JPG tga:- | cjpeg -outfile OUTFILE.JPG -targa

一个没有“:”的程序示例

jpegoptim --dest OUTFOLDER INFILE.JPG

理想情况下它会像这样工作(但事实并非如此):

convert INFILE.JPG jpg:- | jpegoptim --dest OUTFOLDER -

我设法做到了:

BASE64_IMG=$(convert INFILE.JPG jpg:- | base64)

还有:

JPG<(echo "${BASE64_IMG}" | base64 --decode) /dev/stdin | awk '{print $1}'

但我不知道该怎么办......

感谢您的帮助。

【问题讨论】:

  • 我的jpegoptim 版本可以选择--stdin 从标准输入读取。它还处理- 从标准输入读取。
  • 你使用的版本号是多少?
  • jpegoptim v1.4.1 x86_64-pc-linux-gnu.
  • imagemagick 的转换已经产生了优化的 jpeg。
  • 如果它可以从文件中读取,你可以使用命名管道来代替

标签: bash command-line pipe


【解决方案1】:

您可以使用进程替换,如果阅读程序不希望能够在输入中寻找随机位置。 (即只能从文件开头连续读取。)

不正确的版本(需要编写程序以接受 - 作为文件名,表示标准输入;这不是 shell 为您做的事情):

convert INFILE.JPG jpg:- | jpegoptim --dest OUTFOLDER -

变成

jpegoptim --dest OUTFOLDER <(convert INFILE.JPG jpg:-)

&lt;(...) 是特殊的bash 语法,用于简化命名管道的使用。

mkfifo input                        # Create a named pipe called "ipnut"
convert INFILE.JPG jpg:- > input &  # Start writing to it in the background
jpegoptim --dest OUTFOLDER input    # Read from the named pipe; convert blocks until jpegoptim opens the pipe for reading
rm input                            # Clean up after you are done

【讨论】:

  • 即使按照上面给出的步骤,我也无法使其正常工作。
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 2015-01-07
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2015-12-07
  • 2018-08-18
  • 2012-02-29
相关资源
最近更新 更多