Как создавать эскизы в режиме реального времени? - PullRequest
4 голосов
/ 07 мая 2011

Существует ли программа или скрипт, который может читать изображение на стандартном вводе и записывать изображение с измененным размером на стандартный вывод, не ожидая 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 inваш браузер, чтобы увидеть изображение медленно загружается.Если вы передадите кусочки изображения на convert или stream вместо nc (пропуская все эхо-сигналы), в течение десяти секунд не будет отображаться никакого вывода, а затем вы получите весь эскиз сразу.

1 Ответ

9 голосов
/ 07 мая 2011

Это сложно в зависимости от формата изображения. Например, PNG является чанкованным, а каждый чанк - zlib-сжатым, поэтому перед началом рендеринга изображения необходимо прочитать потенциально большую часть файла. Изображения BMP хранятся «снизу вверх», где они отображаются от нижнего правого до верхнего левого, поэтому, если ваш эскиз также не будет BMP, вам придется либо прочитать все изображение целиком, либо обработать файл в обратном направлении. JPEG может сделать это более легко; он хранится по порядку, и если это прогрессивный JPEG, вы можете злоупотреблять этим и читать только за первые N проходов, чтобы получить необходимое разрешение. Форматы вейвлетов, такие как DJVU, также могут быть более простыми.

Я не думаю, что вы найдете инструменты общего назначения, которые делают это, но вы могли бы написать собственный потоковый декодер, зависящий от формата, чтобы справиться с этим.

...