只打开 JPEG 的左上角?

Open only the top left corner of a JPEG?

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

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

背景如下:

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

我已经搜索了一段时间,但没有找到任何提到这种算法的地方,诚然,这是一个特例。

背景

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

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

我不知道现有的库可以做到这一点,但可以修改 IJG C 库中的 jpegtran.cjdtrans.c 以仅读取必要数量的 MCU 行裁剪时,在您的特定情况下,解码时间应减少 ~75%(900 / 4200 行)。

由于您使用的是 Python,您可以获得经过适当裁剪的 jpeg:

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

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