【问题标题】:Capture jpgs produced in subprocess in main script在主脚本的子进程中捕获生成的 jpg
【发布时间】:2013-06-22 20:49:38
【问题描述】:

我不确定这是否可行,但我正在尝试以自动方式从 pdf 生成许多缩略图,然后将它们存储在 elasticsearch 中。基本上我想将 pdf 转换为一系列 jpg(或 png,或任何类似的东西),然后将它们索引为二进制文件。目前我正在制作这样的 jpg:

import subprocess
params = ['convert', 'pdf_file', 'thumb.jpg']
subprocess.check_call(params)

效果很好,但它只是将 jpg 文件写入文件系统。我希望将这些文件作为字符串而不将它们写到本地文件系统中。我试过使用子进程的标准输出方法,但我对使用子进程还很陌生,所以我无法弄清楚这一点。

我正在使用 imagemagick 进行此转换,但只要我能实现此目标,我愿意切换到任何其他工具。 有什么想法吗?

【问题讨论】:

  • 当您在 python 中工作时,最好使用 python 而不是调用外部程序来完成,因为分叉往往很昂贵。
  • @zmo Forks 可能很昂贵,但我用相当大的 pdf 做了几次,所以我认为不通过 python 绑定的收益是值得的。另外我不相信子进程实际上是分叉的。
  • @SlaterTyranus: subprocess 肯定是分叉的(除非你在 Windows 上,在这种情况下它是 CreateProcesses)。它还能如何工作?
  • @SlaterTyranus:PS,你在哪个平台上分叉很贵?它们在 linux 上的速度非常快,而且速度足够快,以至于在 OS X 和其他现代 *BSD 上几乎不重要。)通常 exec 和链接加载器等比 fork 花费的时间要长得多(尽管仍然没有 Windows 长' 创建进程)。

标签: python image pdf thumbnails stdout


【解决方案1】:

您可以让它将数据发送到标准输出...

import subprocess
params = ['convert', 'pdf_file', 'jpg:-']
image_data = subprocess.check_output(params)

【讨论】:

  • 哦,太棒了!正是我想要的。
【解决方案2】:

您可以使用 imagemagick 的 python API,例如:

import PythonMagick

img = PythonMagick.Image("file.pdf")
img.depth = 8
img.magick = "RGB"
data = img.data

或使用wand:

from wand.image import Image

with Image(filename='file.pdf') as img:
    data = img.make_blob('png')

【讨论】:

  • PythonMagick 似乎不再活跃。
  • @SlaterTyranus:对于传统的 ImageMagick,PythonMagick 仍然有效。对于更新、更高级别的 MagickWand API,请改用 PythonMagickWand。或者使用 Wand,它以高级 API 的风格包装了低级 API。 (zmo 的答案已经有一个例子,wand 旁边有一个 PythonMagic。)或者只是去the APIs page 看看现在有什么。 (您可能还想检查 PyPI。)
【解决方案3】:

我希望将这些文件作为字符串而不将它们写入本地文件系统。

这样做的方法是告诉命令将其数据写入标准输出而不是文件,然后从proc.stdout读取它。

并非每个命令都有办法告诉它执行此操作,但在许多情况下,只需将 - 作为输出文件名传递即可,ImageMagick 的 convert 也是如此。当然你还需要给它一个格式,因为它不能再从thumb.jpg的扩展名中猜到它。最简单的方法是在convert 中将类型添加到- 伪文件名前。 (不要用ImageMagick以外的任何东西来尝试。)

所以:

import subprocess
params = ['convert', 'pdf_file', 'jpg:-']
converted = subprocess.check_output(params)

然而,这会给你带来一根巨大的绳子。如果您试图获取一堆单独的图像,则需要将一个巨大的字符串拆分为单独的图像,这可能需要一些 JPEG/JFIF 格式的知识。

【讨论】:

  • 拆分成?等待结论。
  • @SlaterTyranus:糟糕,抱歉。现已修复。
猜你喜欢
  • 2018-07-23
  • 2012-06-28
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2012-03-04
  • 2011-08-04
相关资源
最近更新 更多