GIF изображение искажается при чередовании

Искаженный GIF

У меня есть несколько изображений, которые были преобразованы с помощью Imagemagick и его чересстрочной операции. Это были анимированные GIF- изображения. Проблема в том, что при конвертации изображения искажаются, и у меня нет оригинальных изображений, так как предыдущий разработчик сделал замечательную вещь. GIF больше не анимируется, и каждый кадр имеет 4 копии одного и того же кадра с уменьшающимися размерами. Я не много работал над Imagemagick раньше.

Есть ли способ восстановить исходное изображение из искаженной версии?

Используемая команда была:

convert <old-file.gif> -interlace plane <new-file.gif>

Спасибо

1 ответ

Решение

чересстрочные изображения GIF хранятся как 4 отдельных изображения

  1. содержит каждую 8-ю строку изображения (1/8 размера)
  2. содержит каждую недостающую 4-ю строку изображения (1/8 размера)
  3. содержит каждую пропущенную четную строку изображения (1/4 размера)
  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, который не так прост, как кажется.

увидеть:

Здесь результат копирования кадров + деинтерлейсинга + чересстрочного кодирования (пропуск контроля / информации / вспомогательных каналов...)

отремонтированное изображение

Другие вопросы по тегам