Без потерь сжатие похожих изображений?
Мне нужно уменьшить размер моей библиотеки фотографий, поэтому я, естественно, хочу сжать их. Многие из них не совсем идентичны, но все же очень похожи (последующие кадры одной и той же сцены). Существует ли какой-либо алгоритм сжатия, который использует этот факт для эффективного сжатия этих изображений? 7zip (LZMA) бесполезен.
4 ответа
Вы можете попробовать Paq 8 (fp8_v2.zip). Я просто попробовал сам на 1440 похожих изображениях PNG, а затем снова на 111 похожих изображениях JPG. Вот результаты.
- 1440 файлов PNG, 28 631 615 байт => 2 058 653 байт сжатых
- 111 файлов JPG, 15 003 820 байт => 489 096 байт сжатых
Сжатие файлов PNG заняло около 8 минут и 550 МБ памяти при использовании:
fp8_v2.exe -7 images *.png
Сжатие файлов JPG заняло около 5 минут и 125 МБ памяти при использовании:
fp8_v2.exe -5 images image12*.jpg
Смотрите также: jpg тест сжатия изображений без потерь
Вот простое решение, которое не работает для фотографий, но может работать, если у вас есть несколько изображений с большими попиксельными областями: сохраните изображения в распакованном формате, например BMP (не PNG или GIF), а затем сохраните их в TAR и сожмите с достойным компрессором, как XZ, например, на Linux с чем-то вроде
tar -c myDirectory | xz -9 >myDirectory.tar.xz
Вместо TAR и XZ можно использовать 7-Zip с опцией "сплошной архив", чтобы получить примерно одинаковую производительность. Таким образом, я мог сжать 16 похожих снимков экрана, каждый из которых занимал около 900 КБ при сохранении в виде отдельных файлов PNG, в архив размером 2 МБ. Преимущество этого решения заключается в том, что оно использует общие форматы файлов, поэтому оно работает без установки нового программного обеспечения. (К сожалению, старые и даже более распространенные программы GZIP и BZIP2 не помогли мне - возможно, потому что размер блока BZIP2 не может быть настроен так, чтобы он был больше 900 КБ.)
Я предположил бы, что преобразование Барроуза-Уилера с арифметическим кодером было бы идеальным для этого, учитывая достаточно большое окно. Что произойдет, если вы настроите BZIP2 для использования размера блока, равного небольшому количеству фотографий? Это будет медленнее и займет больше памяти, но степень сжатия должна взлететь. А вы уже пробовали LZMA с блоками большего размера?
Не то чтобы я видел. Вероятно, самым близким было бы взять несколько похожих JPEG-файлов и поместить их в фильм MJPEG. Вы также можете использовать APNG или анимированные GIF-файлы для аналогичных целей.
Я не уверен, насколько хорошо это сработает, и похоже, что вы уже говорите о скриншотах фильмов, поэтому перепаковка их в файл фильма звучит... контрпродуктивно.
Возможно, лучшим способом, если у вас все еще есть клипы, с которых появились экраны, было бы просто найти инструмент командной строки, который может извлечь для вас точный кадр, скопировать этот уникальный идентификатор в текстовый файл где-нибудь, и тогда вы всегда сможете легко извлекать кадр, когда вам это нужно.