2012-06-03 3 views
16

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

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

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

показать нам свое изображение - загрузить его где-нибудь –

+0

@ZoltanToth Где бы вы хотели его загрузить? Это файл .gif, который я создал из http://ajaxload.info/. – Ryan

+1

Кажется, что работает - http://jsfiddle.net/3ZWpD/1/ (я использовал тот же генератор для GIF) –

ответ

2

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

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

Source

+0

http://stackoverflow.com/a/19808575/1256925 - как правило, строчные буквы легче вводить и читать. – Joeytje50

+2

Это неправильный ответ, атрибут устаревшего цикла работает только с фильмами, а не с GIF. Зацикливание кодируется в GIF, а не теге изображения. –

16

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

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

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

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

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

Вот пример:

looping

Hex зрения, так что вы видите, как он добавил:

hex

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


[Редактировать Рид Dunkle]

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

Искать 21 F9 в начале фрагмента шестнадцатеричного (это заголовок). На фотографии выше, это 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 

Сохранить и проверить его.

Аддон по Spektre: Остерегайтесь 21 F9 помечает GFX расширение кусок, который не является обязательным, поэтому он не может присутствовать на всех или каких-либо кадров (но это редкость в наши дни)

+4

«Зараженные браузеры» xD – Viney

+0

Это определенно работает и должно быть принято как лучший ответ. – Grim

+0

Есть намного более легкие ответы, которые избегают возможной человеческой ошибки. Hex редактирование файла сложно! @grimlek –

1

Написал PHP GIF закрепитель на основе ответа по 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); 

    } 

} 

Это делает копию Image.gif как _image.gif с необходимой строкой, вставленной после таблицы цветов и печатает новый Src URL. (Проверяет, является ли изображение уже зафиксировано первое.)

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

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

или

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

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

12

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

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

так в терминале я:

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

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

+1

Именно то, что я искал :) –