GIF изображение искажается при чередовании
У меня есть несколько изображений, которые были преобразованы с помощью Imagemagick и его чересстрочной операции. Это были анимированные GIF- изображения. Проблема в том, что при конвертации изображения искажаются, и у меня нет оригинальных изображений, так как предыдущий разработчик сделал замечательную вещь. GIF больше не анимируется, и каждый кадр имеет 4 копии одного и того же кадра с уменьшающимися размерами. Я не много работал над Imagemagick раньше.
Есть ли способ восстановить исходное изображение из искаженной версии?
Используемая команда была:
convert <old-file.gif> -interlace plane <new-file.gif>
Спасибо
1 ответ
чересстрочные изображения GIF хранятся как 4 отдельных изображения
- содержит каждую 8-ю строку изображения (1/8 размера)
- содержит каждую недостающую 4-ю строку изображения (1/8 размера)
- содержит каждую пропущенную четную строку изображения (1/4 размера)
- содержит каждую нечетную строку изображения (1/2 размера)
Это сделано для того, чтобы изображение можно было видеть при загрузке через медленное интернет-соединение... увеличивая детали с каждым новым фрагментом...
Таким образом, если ваше изображение выглядит как 4 очень похожих изображения, то результат в порядке, вы просто неправильно его декодируете или GIF не установил флаг чересстрочной развертки.
Если ваш файл больше не содержит кадры анимации, то вам не повезло, но если они есть и не рендерится, убедитесь, что конец файла GIF не смещен, или проверьте флаги, которые они могут испортить... Вы пробовали разные GIF Viewer (некоторые глючат)
[Edit1] после декодирования вашего GIF
У вас есть GIF89a, и вам не хватает чересстрочных флагов в каждом кадре. Таким образом, изображение чересстрочно корректно, но зритель считает, что оно вообще не чересстрочно... Необходимо отметить флаг чересстрочной развертки в заголовке каждого кадра.
struct _img // this is image frame header
{
// Logical Image Descriptor
BYTE Separator; /* Image Descriptor identifier 0x2C */
WORD x0; /* X position of image on the display */
WORD y0; /* Y position of image on the display */
WORD xs; /* Width of the image in pixels */
WORD ys; /* Height of the image in pixels */
BYTE Packed; /* Image and Color Table Data Information */
} img;
img.Packed|=64; // this will set the interlaced flag
Для этого вам нужно декодировать / скопировать поток GIF, который не так прост, как кажется.
увидеть:
- Как узнать, где начинается блок изображений в изображениях GIF?
- Декодировать байты данных потока растровых данных GIF87a
Здесь результат копирования кадров + деинтерлейсинга + чересстрочного кодирования (пропуск контроля / информации / вспомогательных каналов...)