2011-05-06 37 views
4

是否有程序或腳本可以讀取標準輸入上的圖像,並將標準輸出寫入已調整大小的圖像而無需等待標準輸入上的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(省略所有回波),則10秒鐘內不顯示任何輸出,然後立即獲取整個縮略圖。

回答

9

根據圖像格式,這很困難。例如,PNG被分塊,並且每個塊zlib壓縮,因此在開始渲染圖像之前,您必須先讀取文件的大部分內容。 BMP圖像被存儲爲「自下而上」,從右下角到左上角呈現,因此除非您的縮略圖也是BMP,否則您將讀取整個圖像或向後處理文件。 JPEG可以更容易地做到這一點;它是按順序存儲的,如果它是漸進式JPEG格式,您可以濫用它並只讀取前N遍以獲取所需的縮略圖分辨率。像DJVU這樣的小波格式也可能更直接。

我不認爲你會找到這樣做的通用工具,但你可以寫一個自定義格式特定的流媒體解碼器來處理它。