stream - 如何实时生成缩略图?

标签 stream image-manipulation real-time

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

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

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

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

IMAGE=test.jpg;切片=10;大小=$(stat -c "%s"$IMAGE); BS=$(($SIZE/$SLICES + 1)); (echo HTTP/1.0 200 OK; echo 内容类型:image/jpeg; echo; for i in $(seq 0 $(($SLICES - 1))); do dd if=$IMAGE bs=$BS Skip=$我计数=1; sleep 1;完成)| nc -lp8080 -q0

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

最佳答案

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

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

关于stream - 如何实时生成缩略图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5916865/

相关文章:

python - 实时数据服务器架构

c++ - 如何从流中读取前 N 位数字作为整数?

java - Storm 如何处理垃圾收集?

stream - 如何在 Dart 中从 Http 请求中读取所有二进制文件?

c++ - 使用 libpng 将 OpenGL 屏幕像素保存为 PNG

python - 使用 Python Image Library 将一张图片切割成多张图片

matlab - 如何从此图像中提取叶子?

linux - 如何在 Yocto 中为评估板(具有制造商的预设内核)设置抢占式实时内核?

python - 从 StringIO 读取直到遇到某个字节的快速方法

Android Wear - 如何将音频输入从手机传输到可穿戴设备?