【问题标题】:Open only the top left corner of a JPEG? [closed]只打开 JPEG 的左上角? [关闭]
【发布时间】:2020-05-09 02:34:17
【问题描述】:

我想知道是否有软件库可以打开 jpeg 并将其子集转换为未压缩的数组(例如 Pillow)。这与打开文件,将其完全转换为位数组,然后获取位数组的子集的更常用方法形成对比。

就我而言,我想到的子集是左上角。文件解压缩为 2544 × 4200 像素,但我只对左上角的 150 × 900 像素感兴趣。

背景如下:

我希望 JPEG 格式是一串压缩子面板,并且当算法处理了足够多的子面板来满足所需的图像子集时,它可以停止。

我已经搜索了一段时间,但没有发现任何提及这种算法的内容,诚然,这是一种特殊情况。

背景

我使用 pyzbar 从高速扫描仪生成的 JPEG 图像的左上角捕获条形码。通常这需要每张图像大约 250 毫秒。 Pyzbar 的实际时间约为 2.5 毫秒,而其他 99% 的时间用于从文件中读取图像,使用 Pillow 对其进行解压缩,提取左上角。

我作为志愿者从事这项工作的非营利组织无法真正负担得起更换价值 25,000 美元的扫描仪,而这个旧机器所拥有的渠道是整体瓶颈。告诉扫描仪发送未压缩的图像会使整个过程减慢至少 90%

【问题讨论】:

  • 枕头有什么问题?
  • Jpeg 数据存储为 8x8 块。如果你能找到jpegtran -crop 的等价物,你也许可以丢弃足够多的它们来获得投资回报率,而无需解码数据。非常有趣的问题。
  • @mkrieger1 在 Pillow 中裁剪图像之前,您必须先解压缩它。减压是这个过程所用时间的 99%。
  • vips 可以做到这一点 - 请在此处查看约翰的出色回答 stackoverflow.com/a/48376269/2836621

标签: python-imaging-library jpeg


【解决方案1】:

我不知道可以执行此操作的现有库,但可以从 IJG C 库中修改 jpegtran.cjdtrans.c,以便在裁剪时仅读取尽可能多的 MCU 行,并且在您的在特定情况下,解码时间应减少约 75%(900 / 4200 行)。

由于您使用的是 Python,因此您可以通过以下方式获得适当裁剪的 jpeg:

os.popen("jpegtran -crop 152x904 %s" % inputfile).read()

这假设输入的 jpeg 不是渐进式的。

【讨论】:

  • 谢谢。这超出了我现在的能力。如果我决定从事 C 编程,我可能会回到它,我最后一次从事 C 编程是在 80 年代中期。我会把它存档,以防万一。
猜你喜欢
  • 2017-05-27
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多