Автор Тема: Частичная загрузка во FreeImage  (Прочитано 3068 раз)

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Частичная загрузка во FreeImage
« : 25 ёоЭм 2010, 13:54:55 »
В библиотеке FreeImage нет такой полезной опции, как частичная загрузка файлов. По-английски я условно назвал это "Partial image loading" (PIL).

Имеется в виду вариант, когда с диска открывается поддерживаемый графический файл, и загружается в память не полностью - а только заголовок + палетка (цветов) + метаданные (если они есть), без загрузки пикселей.

Такое необходимо, если у нас множество графических файлов, и мы хотим как-нибудь малой кровью узнать, какие у них пиксельные размеры, DPI, глубина цветности. Вся эта информация находится в заголовке, в палетке (и в метаданных кое-что есть - но очень редко).

Сейчас приходится загружать целиком весь файл, чтобы узнать эти данные - а это долго. Очень долго.

На форуме FreeImage эта тема давно обсуждается, но авторы FreeImage не торопятся пока реализовать эту фичу - говоря, что это слишком муторная возня.

Я тут на пробу сделал модифицированную версию FreeImage, которая поддерживает PIL - но только исключительно для BMP-файлов (для простоты). Хотелось бы распространить эту фичу на все другие форматы, поддерживаемые FreeImage. Но не знаю, потяну ли я это в одиночку. Это ж надо индивидуально править руками каждый плагин внутри FreeImage, отвечающий за поддержку конкретного формата. Естественно, все плагины друг на друга непохожи - форматы-то бывают самыми прихотливыми.

Эта тема обсуждается на форуме FreeImage здесь:

https://sourceforge.net/projects/freeimage/forums/forum/36111/topic/1428410

Вот моя пробная реализация частичной загрузки:

http://www.djvu-soft.narod.ru/soft/fi_mod_v1_0.rar  (4,81 МБ)

Внутри - модифицированный (перекомпилированный) FreeImage.dll + исходники, а также пример кода, объясняющий, как это использовать. Я модифицировал одну из старых версий FreeImage - 3.9.2 - потому что там есть компиляционный проект под MS VC++ 6.0 (который я использую). Последние версии FreeImage уже не имеют такового, и я не могу их скомпилировать под MS VC++ 6.0 (по крайней мере, в первом приближении).

Пробная реализация работает только для BMP-файлов. Все остальные форматы - тоже работают, но по-старому - т.е. без возможности частичной загрузки.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Частичная загрузка во FreeImage
« Ответ #1 : 30 ёоЭм 2010, 18:17:43 »
Я сделал новую модификацию библиотеки FreeImage с поддержкой частичной загрузки файлов:

http://www.djvu-soft.narod.ru/soft/fi_mod_v1_1.rar  (4,80 МБ)

Внутри - модифицированный (перекомпилированный) FreeImage.dll + исходники, а также пример кода, объясняющий, как это использовать.

Я просто распространил эту опцию ещё на несколько форматов, поддерживаемых FreeImage. Теперь список форматов, поддерживающих частичную загрузку, выглядит так:

BMP, TIF, TIFF, JPG, JPEG, PNG, PNM, PPM, PGM, PBM, PAM, GIF.

Однако, не всё получилось гладко. Например, из файла не загружаются данные о прозрачности (для некоторых форматов) и не гарантируется загрузка метаданных (для тех форматов, где они есть).