Использую утилиту gifsicle для разбора анимированного gif по кадрам
в резултате получаю предупреждения типа:
warning: GIF too complex to unoptimize
(The reason was local color tables or complex transparency.
Try running the GIF through ‘gifsicle --colors=255’ first.)
gifsicle:/users/cok/docs/temp/frames/1.gif.000: warning: trivial adaptive palette (only 185 colors in source)
кадры получаются битые
как видно проблема заключается либо в прозрачности либо в локальных таблицах цветов каждого кадра
во вложении 3 кадра по номерам:
0-й получается не битый, при этом значение transparent 210
10-й получается битый совсем немного, при этом значение transparent 25
остальные совсем битые, у них transparent 0
(что конкретно означает число transparent пока не разобрался)
видимо нужно какие-то параметры еще в команде прописывать, но не могу понять какие
те что warning выдает (--colors=255) никакого эффекта не дают
как я понимаю изображение оптимизировано таким образом что в кадре пиксели которые не изменились по отношению к предыдущему кадру - пустые, и видимо при выдергивании кадра так и остаются пустыми, хотя попробовал открыть в фотошопе, там каждый слой показывается нормально.
Исходное изображение:
https://www.dropbox.com/s/rqjr89w4s75aij5/input.gif?dl=00-й кадр:
https://www.dropbox.com/s/pu3010n9btpr1aw/0.gif?dl=010-й кадр:
https://www.dropbox.com/s/agejb6v9xk4pjos/10.gif?dl=08-й кадр:
https://www.dropbox.com/s/9p9svto2bqm564s/8.gif?dl=0gifsicle -I
https://www.dropbox.com/s/iq45m9a0zh2jf6q/colors.txt?dl=0gifsicle --cinfo
https://www.dropbox.com/s/90jw5siq4pa9azh/info.txt?dl=0Вот, кстати, если удалить 0-й кадра, вот что получится:
https://www.dropbox.com/s/hsyhsaov6br62zj/-0.gif?dl=0, то есть догадки подтверждаются, а на 10-м кадре как раз картинка меняется, потому он и менее битый, так как очень мало неповторяющихся пикселей
В мануале есть опция --unoptimize, после применения которой, каждый кадр должен выглядеть так как его видит пользователь, но этого не происходит
gifsicle --unoptimize 2.gif "#8" > 1.gif
gifsicle: 2.gif: warning: GIF too complex to unoptimize
(The reason was local color tables or complex transparency.
Try running the GIF through ‘gifsicle --colors=255’ first.)
В чем причина, как я вижу:
8-й кадр содержит пиксели различных цветов (цветов не более 256) и прозрачные пиксели (ну или 255 и прозрачный, точно не знаю ,это тонкости)
через эти прозрачные пиксели видны пиксели предыдущих кадров ( 0-7) и в каждом по 256 цветов, и не факт что они совпадают, то есть на самом деле в 8 кадре гораздо больше чем 256 цветов, а сохранить отдельный кадр можно только с 256 цветами, сохранение идет с локальной цветовой таблицей данного кадра скорее всего, а нужно, видимо, создать одну таблицу для всех кадров
выполняем команду
gifsicle --colors=256 2.gif > 1.gif
и получаем анимашку которая использует всего 256 цветов
https://www.dropbox.com/s/luv8w2962f5crrp/255colors.gif?dl=0с красными разводами, ну а куда деваться, цветов мало
а теперь из нее извлекаем например 8-й кадр
gifsicle --unoptimize 1.gif "#8" > 8_.gif
https://www.dropbox.com/s/khcqrccaty8bx1s/8_.gif?dl=0Ну видимо это максимально возможный результат которого можно достичь ( ну если быть точным то можно поочередно удалять из исходника последующие кадры ( 9, 10 и тд)) и приводить к 256 цветам анимашку из меньшего кол-ва кадров, таким образом, чем ближе кадр к началу тем лучше будет его качество)
Вот, как то так сами и оветил на свой вопрос
Но нет, все таки это не решение. Есть программка под винду
http://www.easy2convert.com/gif2jpg/ - она отлично сохраняет каждый кадр в jpeg без потерь цвета, да и в фотошопе, как я уже писал, каждый кадр отображается нормально, значит и с помощью Linuxовых утилит как-то можно это сделать.