Подходящий формат файла изображения для сжатия серии снимков экрана без потерь - PullRequest
2 голосов
/ 07 сентября 2011

Я создаю приложение, которое делает большое количество снимков экрана в процессе «записи» операций, выполняемых пользователем на рабочем столе Windows.

По понятным причинам я хотел бы хранить эти данные настолько эффективно, насколько это возможно.

Сначала я подумал об использовании формата PNG, чтобы сделать это.Но я наткнулся на это: http://www.olegkikin.com/png_optimizers/

Лучшие алгоритмы смогли улучшить изображение графического интерфейса только на 3-5%.Это очень обескураживает и показывает, что мне нужно будет работать лучше, потому что простое использование PNG не позволит мне использовать предыдущие кадры для повышения степени сжатия.Размер файла будет расти линейно со временем.

Я думал о том, чтобы решить эту проблему с помощью небольшого взлома: просто сохраняйте кадры в группах по несколько штук рядом.Например, я мог бы просто сохранить содержимое 10 снимков 1280x1024 в одном изображении 1280x10240, тогда при сжатии должна быть возможность использовать повторы для соседних изображений.

Но проблема в том, что алгоритмы, используемые для сжатия PNG, не предназначены для этого.Я произвольно размещаю изображения с интервалами в 1024 пикселя друг от друга, и только 10 из них могут быть сгруппированы одновременно.Из того, что я собрал после нескольких минут сканирования спецификации PNG, сжатие работает на отдельных линиях сканирования (которые фильтруются), а затем объединяется в фрагменты, так что на самом деле нет никакой возможности ссылаться на информацию с 1024 пикселей выше снизу.

Итак, я нашел формат MNG, который расширяет PNG, чтобы разрешить анимацию.Это гораздо больше подходит для того, что я делаю.

Одна вещь, которая меня беспокоит, это то, насколько сильно поддерживается «расширение» изображения / анимации новыми кадрами.Природа генерации данных в моем приложении заключается в том, что новые кадры периодически добавляются в список.Но у меня есть простое полу-решение этой проблемы, которое заключается в том, чтобы кэшировать кусок недавно сгенерированных данных и постепенно создавать «анимацию», скажем, каждые 10 кадров.Это позволит мне связать в оперативную память только 10 кадров несжатых изображений, что не так хорошо, как немедленная выгрузка их в файловую систему, но это не страшно.После завершения всего процесса (или даже использования свободных циклов в свободном потоке во время выполнения) я могу легко вернуться и сшить группы по 10, если это даже стоит усилий.

Вот мой актуальный вопрос, к которому все привело.Является ли MNG лучшим форматом для моих требований?Вот некоторые требования: 1. Реализация на C / C ++, доступная с разрешающей лицензией, 2. Разрешение 24/32 бита, разрешение 4+ мегапикселя (некоторые используют 30-дюймовые мониторы), 3. Сжатие без потерь или почти без потерь (сохраняет четкость текста)с положениями для ссылки на предыдущие кадры, чтобы помочь этому сжатию.

Например, вот еще один вариант, о котором я подумал: видеокодеки.Я хотел бы иметь качество без потерь, но я видел примеры того, как h.264 / x264 воспроизводит удивительно четкие кадры, а его производительность такова, что я могу снимать с гораздо более быстрым интервалом.Я подозреваю, что мне просто нужно реализовать оба из них и сделать мой собственный сравнительный анализ, чтобы адекватно удовлетворить мое любопытство.

1 Ответ

3 голосов
/ 07 сентября 2011

Если у вас есть доступ к реализации сжатия PNG, вы можете легко оптимизировать сжатие, не используя формат MNG, просто предварительно обработав «следующее» изображение в отличие от предыдущего.Это наивно, но эффективно, если скриншоты не сильно меняются, а сжатие «почти пустых» PNG значительно уменьшит требуемое пространство для хранения.

...