Чтение части изображения без разбора всего файла.Какой формат файла и библиотеки использовать? - PullRequest
2 голосов
/ 31 января 2011

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

Итак, мы ищем формат файла, который

  • можно быстро проанализировать (должен выполнятьсяво встроенной системе Linux)
  • может считывать некоторую часть изображения без декодирования всего файла
  • использует сжатие без потерь (без 8-битных таблиц цветов, пожалуйста)
  • включаетполный альфа-канал (не просто битовая маска, как в GIF)
  • компилируется и работает в Linux и Windows
  • может использоваться в коммерческом приложении (LGPL в порядке)
  • можно экспортировать в Photoshop

Моим первым предположением было PNG, но я не уверен, что смогу разобрать часть изображения без декодирования всего файла.У вас есть идея или опыт, которым вы хотите поделиться?

Ответы [ 2 ]

1 голос
/ 31 января 2011

(у меня сложилось впечатление, что вы сталкиваетесь с давлением оперативной памяти, а не с ограничениями при хранении - если я ошибаюсь, игнорируйте это)

Сжатие сэкономит место на диске, но я не думаю, что оно обязательно будетчтобы помочь (и даже может быть контрпродуктивно) уменьшить объем оперативной памяти, поскольку вы (или, по крайней мере, ОС) копируете сжатые данные в оперативную память, а затем распаковываете их в еще более оперативную память.

Если у вас естьдовольно сырой растровый формат, просто вычислить смещение файла любых пикселей, представляющих интерес, и использовать fseek () для получения небольшого количества данных.Упакованный формат, который объединяет цвета / каналы вместе, может быть даже лучше, особенно если это формат, непосредственно полезный для вашего вывода (отображение или алгоритм или любой другой).

Таким образом, можно было бы идентифицировать существующий формат.то есть или напишите подпрограмму для предварительной обработки изображений в упакованный растровый формат, непосредственно используемый вашим выходом, и выясните, как сделать это плагином для фотошопа, или напишите инструмент массового конвертера, подключенный к тому, что записывает флэш-карты илидругие устройства хранения данных, используемые вашей встроенной системой (вы можете рассмотреть кодирование его как выходного драйвера для imagemagick, чтобы обеспечить гибкость формата ввода этих пакетов).Затем встроенный конец вашего кода становится чрезвычайно простым и эффективным для использования памяти, поскольку он только перемещает в оперативную память те данные, которые ему действительно нужны (по размеру буферизованного по O / S объема чтения, но эти буферы следует перерабатывать за кулисами)

1 голос
/ 31 января 2011
Будет работать

JPEG с использованием библиотеки ijg . Посмотрите здесь и здесь .

Коротко:

  1. энтропийное декодирование JPEG изображения
  2. получить коэффициенты DCT интересующих вас блоков
  3. IDCT только нужные вам блоки

Суть в том, что вам все еще нужно энтропийно-декодировать весь файл, но это только часть полного конвейера декодирования (IDCT всего изображения - это то, что занимает больше всего времени). Таким образом, вы должны передать весь файл, но на самом деле вы не «расшифровываете весь файл».

Поскольку вас беспокоит память, вам, вероятно, будет приятно узнать, что в декодере ijg JPEG есть несколько диспетчеров памяти для работы в системах с различными требованиями к памяти. Вам придется обратиться к документации для этого (это часть дистрибутива, я не мог сразу найти ссылку в Интернете).

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...