Вьюеры картинок
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 11:39 am (UTC)no subject
Date: 2009-09-28 12:27 pm (UTC)Не самая специализированная задача.
(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-09-28 11:44 am (UTC)Я вот специально просмотрел все, что есть среди свободного софта. Картина -- ровно как я тебе и описал, и как ты ее сейчас в этом посте и перепечатал. Думать не хотят, фреймворки заруливают всех остальных, задач нет для использования реалистичных алгоритмов. В больших конторах скорее напрягут поправить UI, чтобы он был в соответствии со спецификацией, написанной UI-дизайнером, чем за такие вещи.
Пример с GEGL я привел ровно для того, чтобы продемонстрировать -- даже в библиотеке, в которой заранее была продумана возможность работать с огромной картинкой, все плохо, потому что нет четких спецификаций и задач. Пишут как бы для себя, но в то же время и не для себя, для галочки.
no subject
Date: 2009-09-28 11:53 am (UTC)Метод последовательных приближений, которым это добро развивалось с середины 80-х, себя исчерпал.
Вопрос в том, сколько человеко-лет надо вложить в этот проект (и сопутствующую документацию для разработчиков) чтобы оно начало тотально превосходить существующую экосистему состоящую из фреймворков и кодеров, не умеющих ставить задачи.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-09-28 11:48 am (UTC)no subject
Date: 2009-09-28 11:51 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-09-28 11:53 am (UTC)Ты готов написать ещё одну реализацию TIFF со всей его тысячью тегов и двумя дестяками интерпритаций “сырых” битмап-данных в зависимости от набора флагов и тегов?
no subject
Date: 2009-09-28 12:00 pm (UTC)В libtiff, например, есть TIFFReadScanline, в libjpeg - соответственно
jpeg_read_scanlines.
Поэтому обработку форматов писать не придется. Разве что из соображений пооптимизировать. Например в случает jpeg уменьшении более чем в 8 раз можно очень хорошо пооптимизировать. cjpeg это умеет.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2009-09-28 12:00 pm (UTC)no subject
Date: 2009-09-28 12:13 pm (UTC)no subject
Date: 2009-09-28 01:15 pm (UTC)no subject
Date: 2009-09-28 02:19 pm (UTC)оффтопик
Date: 2009-09-28 02:39 pm (UTC)а нельзя ли там премодерацию ввести? а то спам достал.
вот свежий:
http://community.livejournal.com/ru_debian/185147.html
http://community.livejournal.com/ru_debian/185009.html
Re: оффтопик
Date: 2009-09-28 03:11 pm (UTC)Re: оффтопик
From:no subject
Date: 2009-09-28 02:54 pm (UTC)no subject
Date: 2009-09-28 03:12 pm (UTC)no subject
Date: 2009-09-28 03:26 pm (UTC)Фотошоп, например, картинку в 8 гигабайт на 2 Гб ОЗУ показывает хорошо. Но там в ТЗ было такое требование.
no subject
Date: 2009-09-28 05:13 pm (UTC)(no subject)
From:no subject
Date: 2009-09-28 08:04 pm (UTC)(no subject)
From:no subject
Date: 2009-09-28 06:37 pm (UTC)no subject
Date: 2009-09-28 06:51 pm (UTC)no subject
Date: 2009-09-28 08:03 pm (UTC)no subject
Date: 2009-09-29 12:43 am (UTC)Скан поди в tiff?
Хотя может на буке винт медленный, это ведь влияет...
no subject
Date: 2009-09-29 08:29 am (UTC)no subject
Date: 2009-09-29 09:31 am (UTC)no subject
Date: 2009-09-29 09:55 pm (UTC)no subject
Date: 2009-09-30 06:25 am (UTC)no subject
Date: 2009-09-30 06:38 am (UTC)no subject
Date: 2009-09-30 06:26 am (UTC)no subject
Date: 2009-09-30 06:41 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: