是否有程序或脚本可以读取标准输入上的图像并将调整大小的图像写入标准输出而无需等待标准输入上的EOF?质量差可以接受;等待整个图像加载不是。
ImageMagick(convert
和stream
等)将读取,然后处理,然后输出。我想要的更像是一个实时流处理器:如果我缩小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
以查看图像缓慢加载。如果将图像切片传输到convert
或stream
而不是nc
(省略所有回波),则十秒钟内不会显示任何输出,然后您立即获得整个缩略图。 / p>
答案 0 :(得分:9)
根据图像格式,这很困难。例如,PNG是分块的,每个块都是zlib压缩的,因此在开始渲染图像之前,必须先读入文件的大部分内容。 BMP图像存储在“自下而上”,从右下角渲染到左上角,因此除非您的缩略图也是BMP,否则您将读取整个图像或向后处理文件。 JPEG可以更容易地做到这一点;它按顺序存储,如果它是渐进式JPEG,你可以滥用它并只读取前N个通道以获得所需的缩略图分辨率。像DJVU这样的小波格式也可能更直接。
我认为您不会找到执行此操作的通用工具,但您可以编写自定义格式的流解码器来处理它。