Вьюеры картинок
Sep. 28th, 2009 02:58 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Почему-то среди широко известных опенсурсных программ нет программы, которая бы позволяла просматривать БОЛЬШИЕ картинки. Под "большой картинкой" здесь понимается растровое изображение таких размеров, что его неупакованное RGB-представление (обычно получается по 32 бита на пиксел, но достаточно и 24) не лезет в оперативную память.
То есть в resource-constrained environments вроде maemo "большой картинкой" будет уже лист А4, отсканированный на 600dpi. На десктопе с гигабайтом жизнь попроще. Но все равно есть вполне полезные вещи вроде graphviz, которые могут сгенерировать картинку, которая будет большой и для десктопа.
Задача, казалось бы элементарно простая - читаем картинку последовательно, пересчитываем координаты пикселов с учетом текущего размера окна, масштаба и выбранного viewport и заполняем offscreen pixmap размером с экран. На неё-то места хватит практически всегда. Это в DOS real mode на копию VESA-шного фреймбуфера в памяти места не хватало. И то вьюеры картинок под DOS писали и они работали.
Оказывается проблема в том, что у современного программиста даже не возникает мысль подойти к задаче системно. Вместо этого ищется готовый инструмент. На освоение которого уходит больше времени и сил, чем на написание вышеописанного простого алгоритма с нуля. Причем, желательно инструмент поуниверсальнее. Берем какой-нибудь GEGL и обнаруживаем что ему для загрузки картинки в свой tiled формат требуется больше места, чем у нас имеется в том, что на нашем девайсе заменяет жесткий диск.
То есть в resource-constrained environments вроде maemo "большой картинкой" будет уже лист А4, отсканированный на 600dpi. На десктопе с гигабайтом жизнь попроще. Но все равно есть вполне полезные вещи вроде graphviz, которые могут сгенерировать картинку, которая будет большой и для десктопа.
Задача, казалось бы элементарно простая - читаем картинку последовательно, пересчитываем координаты пикселов с учетом текущего размера окна, масштаба и выбранного viewport и заполняем offscreen pixmap размером с экран. На неё-то места хватит практически всегда. Это в DOS real mode на копию VESA-шного фреймбуфера в памяти места не хватало. И то вьюеры картинок под DOS писали и они работали.
Оказывается проблема в том, что у современного программиста даже не возникает мысль подойти к задаче системно. Вместо этого ищется готовый инструмент. На освоение которого уходит больше времени и сил, чем на написание вышеописанного простого алгоритма с нуля. Причем, желательно инструмент поуниверсальнее. Берем какой-нибудь GEGL и обнаруживаем что ему для загрузки картинки в свой tiled формат требуется больше места, чем у нас имеется в том, что на нашем девайсе заменяет жесткий диск.
no subject
Date: 2009-09-28 12:00 pm (UTC)В libtiff, например, есть TIFFReadScanline, в libjpeg - соответственно
jpeg_read_scanlines.
Поэтому обработку форматов писать не придется. Разве что из соображений пооптимизировать. Например в случает jpeg уменьшении более чем в 8 раз можно очень хорошо пооптимизировать. cjpeg это умеет.
no subject
Date: 2009-09-28 12:44 pm (UTC)... Меня окружали милые симпатичные люди, медленно сжимая кольцо ...
no subject
Date: 2009-09-28 12:54 pm (UTC)no subject
Date: 2009-09-28 03:15 pm (UTC)no subject
Date: 2009-09-29 09:27 pm (UTC)Правда, речь только о масштабировании всей картинки -- возможности вырезать из неё прямоугольник, не храня того, что снаружи, всё равно нет. :-(
... И они хитрили, и Аллах хитрил, а Аллах - величайший из хитрецов! ...
no subject
Date: 2009-09-30 06:43 am (UTC)Ну или скрипт на python, tcl ли чем угодно, но с собственной C-шной библиотекой чтения картинки. Потому что задача "показать кусок большой картинки в масштабе 1:1 (т.е. пиксел картинки в пиксел экрана)" не менее важна, чем задача "показать всю большую картинку, уменьшив до размера экрана".