Анимированный gif только петли один раз в Chrome и Firefox - программирование
Подтвердить что ты не робот

Анимированный gif только петли один раз в Chrome и Firefox

У меня есть анимированный gif, который я хочу отображать в любое время, когда загружается страница. Когда я просматриваю изображение за пределами браузера, изображение циклически бесконечно и работает отлично, но всякий раз, когда я показываю изображение в браузере, анимация только петли один раз. Есть ли у кого-нибудь предложения по созданию цикла изображения бесконечно?

В настоящее время я просто делаю это, чтобы изображение выглядело так, как будто оно появляется, но только один раз:

document.getElementById('ajaxloader').innerHTML = 
    '<img src="images/ajax-loader.gif" title="Loading, please wait..">';
4b9b3361

Ответ 1

У меня была та же проблема с моим классом кодировщика/декодера GIF, который я написал некоторое время назад (и время от времени улучшался). Я нашел решение для этого только вчера. GIF полностью прекрасен, проблема в современной стороне интернет-браузера. Зараженные браузеры - это Opera, IE, Chrome (не тестировали других).

После некоторого исследования по этому вопросу (путем сравнения циклов и несинхронизации изображений) я обнаружил, что эти браузеры GIF декодеры игнорируют параметры цикла в файле GIF. Вместо этого они зависят от недокументированного расширения приложения в первом кадре файла GIF.

Таким образом, решение состоит в том, чтобы добавить эту команду расширения непосредственно перед данными первого кадра. Добавьте этот кусок:

0x21,0xFF,0x0B,"NETSCAPE","2.0",0x03,0x01,0x00,0x00,0x00

Это заставит браузеры бесконечно зацикливаться.

Здесь пример:

looping

Вид шестнадцатеричного просмотра, чтобы вы могли увидеть, как он добавлен:

hex

GIF не чувствителен при вставке/переупорядочивании фрагментов без изображения, поэтому вы можете вставить это перед первым изображением в любом месте между любым другим расширением. Я положил его непосредственно после заголовка + палитры. Это можно сделать с помощью С++ или любого другого языка. (повторное кодирование не требуется). Для получения дополнительной информации см.:


[Редактировать Ридом Данкелем]

Вы также можете сделать это вручную с помощью Hex Editor. Я использовал "Hex Fiend" на macOS Sierra.

Найдите 21 F9 в начале фрагмента hex (это заголовок). На фото выше 21 F9 04 04 00 00 00 00. Возможно, вы немного отличались, но обратите внимание, что он предшествует 2C, который отмечает начало блока изображения.

Перед 21 F9... частью вставьте следующий шестнадцатеричный символ, помеченный как "расширение приложения" на фотографии выше:

21 FF 0B 4E 45 54 53 43 41 50 45 32 2E 30 03 01 00 00 00

Сохраните и протестируйте его.

Addon by Spektre: Beware 21 F9 отмечает расширение gfx, которое необязательно, поэтому оно может не присутствовать для всех или любых фреймов (но в наши дни это очень редко)

Ответ 2

Вы можете использовать инструмент командной строки gifsicle для обработки анимированного gif и добавить правильный цикл, совместимый со всеми браузерами:

Animation options: -l, --loopcount[=N] Set loop extension to N (default forever).

поэтому в терминале я:

$ gifsicle --loopcount problem.gif > fixed.gif

Создает новый Анимированный GIF, который работает в Chrome и Firefox, а также Safari.

Ответ 3

Вы можете указать конечное число циклов, или вы можете сделать цикл фильма навсегда. INFINITE (или -1) циклически перемещает фильм снова, пока страница находится на экране. Например, этот код создает фильм, который непрерывно циклически:

<img 
  src="../graphics/moonflag.mpg" 
  dynsrc="../graphics/moonflag.mpg"
  loop=infinite
  alt="Astronauts on the moon">

Источник

Ответ 4

Написал PHP gif fixer на основе ответа Spektre:

/**
 * gif image loop fixer, prints image full url
 * 
 * as this is written as a part of framework, there are some config options
 */

// put your images absolute path here eg '/var/www/html/www.example.com/images/'
// or use autodetection below
$GLOBALS['config']['upload_path'] = str_replace("\\", "/", trim(getcwd(), " /\\")).'/images/';

// put your images relative/absolute url here, eg 'http://www.example.com/images/';
$GLOBALS['config']['upload_url'] = '/images/';

function _ig($image){

    $image_a = pathinfo($image);

    $new_filename = $GLOBALS['config']['upload_path'].$image_a['dirname'].'/_'.$image_a['filename'].'.'.$image_a['extension'];
    $new_url = $GLOBALS['config']['upload_url'].$image_a['dirname'].'/_'.$image_a['filename'].'.'.$image_a['extension'];

    if ($image_a['extension'] == 'gif'){

        if (!file_exists($new_filename)){

            // load file contents
            $data = file_get_contents($GLOBALS['config']['upload_path'].$image);

            if (!strstr($data, 'NETSCAPE2.0')){

                // gif colours byte
                $colours_byte = $data[10];

                // extract binary string
                $bin = decbin(ord($colours_byte));
                $bin = str_pad($bin, 8, 0, STR_PAD_LEFT);

                // calculate colour table length
                if ($bin[0] == 0){
                    $colours_length = 0;
                } else {
                    $colours_length = 3 * pow(2, (bindec(substr($bin, 1, 3)) + 1)); 
                }

                // put netscape string after 13 + colours table length
                $start = substr($data, 0, 13 + $colours_length);
                $end = substr($data, 13 + $colours_length);

                file_put_contents($new_filename, $start . chr(0x21) . chr(0xFF) . chr(0x0B) . 'NETSCAPE2.0' . chr(0x03) . chr(0x01) . chr(0x00) . chr(0x00) . chr(0x00) . $end);

            } else {

                file_put_contents($new_filename, $data);

            }

        }

        print($new_url);

    } else {

        print($GLOBALS['config']['upload_url'].$image);

    }

}

Это делает копию образа .gif как _image.gif с нужной строкой, вставленной после таблицы цветов, и выводит новый url-адрес src. (Проверяет, что изображение уже исправлено.)

Использование:

<img src="<?php _ig($image); ?>">

или

<img src="<?php _ig('image.gif'); ?>">

Отказ от ответственности: никаких обязанностей не принято, и я знаю, что это можно оптимизировать:)