Я создаю приложение, которое делает большое количество снимков экрана в процессе «записи» операций, выполняемых пользователем на рабочем столе 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 воспроизводит удивительно четкие кадры, а его производительность такова, что я могу снимать с гораздо более быстрым интервалом.Я подозреваю, что мне просто нужно реализовать оба из них и сделать мой собственный сравнительный анализ, чтобы адекватно удовлетворить мое любопытство.