是否有程序或脚本可以在标准输入上读取图像并将调整大小的图像写入标准输出,而无需等待标准输入上的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
(省略所有回声),则十秒钟内不显示任何输出,然后立即获得整个缩略图。
根据图像格式,这很困难。 例如,PNG 是分块的,每个块都是 zlib 压缩的,因此您必须在开始渲染图像之前读取文件的潜在大部分内容。 BMP 图像"自下而上"存储,从右下角渲染到左上角,因此除非您的缩略图也是 BMP,否则您将读取整个图像或向后处理文件。 JPEG 可以更容易地做到这一点;它是按顺序存储的,如果它是一个渐进式 JPEG,你可以滥用它,只读取前 N 个通道以获得你需要的缩略图分辨率。 像DJVU这样的小波格式也可能更直接。
我不认为你会找到这样做的通用工具,但你可以编写一个自定义格式特定的流解码器来处理它。