Мне нужно уменьшить размер моей библиотеки фотографий, поэтому я, естественно, хочу сжать их. Многие из них не совсем идентичны, но все же очень похожи (последовательные снимки одной и той же сцены). Есть ли какой-либо алгоритм сжатия, который использует этот факт для эффективного сжатия этих изображений? 7zip (LZMA) бесполезен.
решение1
Вы можете попробоватьПак 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 без потерь
решение2
Вот простое решение, которое не работает для фотографий, но может сработать, если у вас есть несколько изображений с большими попиксельно идентичными областями: сохраните изображения в распакованном формате, например 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 КБ.)
решение3
Я бы предположил, что преобразование Берроуза-Уиллера с арифметическим кодером было бы идеальным для этого, учитывая достаточно большое окно. Что произойдет, если вы настроите BZIP2 на использование размера блока, равного небольшому количеству фотографий? Это будет медленнее и займет больше памяти, но степень сжатия должна резко возрасти. А вы уже пробовали LZMA с большими размерами блоков?
решение4
Не то, что я видел. Вероятно, наиболее близким вариантом было бы взять несколько похожих JPEG и объединить их в фильм MJPEG. Вы также можете использовать APNG или анимированные GIF для той же цели.
Я не уверен, насколько хорошо это сработает, и похоже, что вы уже говорите о скриншотах фильмов, так что переупаковка их в файл фильма звучит... контрпродуктивно.
Возможно, лучшим способом, если у вас все еще есть клипы, из которых были сделаны скриншоты, было бы просто найти инструмент командной строки, который может извлечь для вас точный кадр, скопировать этот уникальный идентификатор в текстовый файл куда-нибудь, а затем вы всегда сможете легко повторно извлечь кадр, когда он вам понадобится.