【问题标题】:How to produce thumbnails in real-time?如何实时生成缩略图?
【发布时间】:2011-05-06 20:49:08
【问题描述】:

是否有程序或脚本可以在标准输入上读取图像并将调整大小的图像写入标准输出而无需等待标准输入上的 EOF?质量差是可以接受的;等待整个图像加载不是。

ImageMagick(convertstream 类似)将读取、处理、然后输出。我想要的更像是一个实时流处理器:如果我缩小 50%,它应该为每两行输入(大致)输出一行缩略图,而不管输入流的状态如何。

如果这还没有意义,假设您正在通过慢速网络连接加载图像。只要可以,浏览器就会开始显示图像的上边缘。如果图像大于窗口,浏览器会缩小它以适应窗口。它不必等待整个图像加载。

以下是我用于测试的一些工具。这会以十个切片在端口 8080 上提供图像,切片之间有一秒的延迟以模拟慢速网络连接:

IMAGE=test.jpg; SLICES=10; SIZE=$(stat -c "%s" $IMAGE); BS=$(($SIZE / $SLICES + 1)); (echo HTTP/1.0 200 OK; echo Content-Type: image/jpeg; echo; for i in $(seq 0 $(($SLICES - 1))); do dd if=$IMAGE bs=$BS skip=$i count=1; sleep 1; done) | nc -lp8080 -q0

运行它并立即在浏览器中打开localhost:8080 以查看图像缓慢加载。如果您将图像切片通过管道传送到convertstream 而不是nc(省略所有回声),十秒钟内不会出现任何输出,然后您会立即获得整个缩略图。

【问题讨论】:

    标签: stream image-manipulation real-time


    【解决方案1】:

    这很困难,具体取决于图像格式。例如,PNG 是分块的,并且每个块都经过 zlib 压缩,因此在开始渲染图像之前,您必须读取文件的很大一部分。 BMP 图像是“自下而上”存储的,它从右下角渲染到左上角,因此除非您的缩略图也是 BMP,否则您将读取整个图像或向后处理文件。 JPEG 可以更轻松地做到这一点;它是按顺序存储的,如果它是渐进式 JPEG,您可以滥用它并仅读取前 N 次传递以获得所需的缩略图分辨率。像 DJVU 这样的小波格式也可能更直接。

    我认为您不会找到执行此操作的通用工具,但您可以编写一个自定义格式特定的流式解码器来处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多