Как программно проверить, является ли изображение GIF анимированным?

В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на одно и то же место в памяти.

Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object и переопределяет этот метод, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.

Оператор == проверяет, являются ли две строки точно одним и тем же объектом.

Метод .equals() проверяет, имеют ли две строки одно и то же значение.

13
задан Community 23 May 2017 в 12:13
поделиться

8 ответов

С Python и PIL :

from PIL import Image
gif = Image.open('path.gif')
try:
    gif.seek(1)
except EOFError:
    isanimated = False
else:
    isanimated = True
18
ответ дан 1 December 2019 в 17:37
поделиться

Если вы работаете в Linux (или любой системе с ImageMagick ), вы можете использовать однострочный сценарий оболочки и идентифицировать программу:

identify *.gif | fgrep '.gif[1] '

Я знаю, что вы сказали, что предпочитаете PHP и Python, но вы также сказали, что готовы изучить другие решения. :)

13
ответ дан 1 December 2019 в 17:37
поделиться

Я никогда не видел программы, которая сообщила бы вам это. Но GIF - это формат с блочной структурой, и вы можете проверить, присутствует ли в ваших файлах блок, указывающий на анимированный GIF.

Из статьи в Википедии, указанной ниже: со смещением 0x30D блок расширения приложения (т. Е .: 3-байтовое магическое число 21 FF 0B) в файле GIF, за которым следует магическое число 4E 45 54 53 43 41 50 45 32 9 со смещением 0x310 указывает, что остальная часть файла содержит несколько изображений, и они должны быть анимированы.

На самом деле статья в Википедии объясняет это лучше, а документы о формате, указанные ниже, расширяют статью в Вики.

Таким образом, вы можете анализировать GIF-файлы с помощью программы, написанной на Python (я анализировал GIF-файлы с помощью C много лет назад, в основном это было упражнение по перемещению указателя файла и чтению байтов). Определите, присутствует ли AE с правильным 3-байтовым идентификатором,

7
ответ дан 1 December 2019 в 17:37
поделиться

Некоторые решения приведены в документации PHP страница для функции imagecreatefromgif .

Судя по решениям, которые я читал, это кажется лучшим из-за более жестких требований к памяти.

<?php
function is_ani($filename) {
    if(!($fh = @fopen($filename, 'rb')))
        return false;
    $count = 0;
    //an animated gif contains multiple "frames", with each frame having a
    //header made up of:
    // * a static 4-byte sequence (\x00\x21\xF9\x04)
    // * 4 variable bytes
    // * a static 2-byte sequence (\x00\x2C)

    // We read through the file til we reach the end of the file, or we've found
    // at least 2 frame headers
    while(!feof($fh) && $count < 2) {
        $chunk = fread($fh, 1024 * 100); //read 100kb at a time
        $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches);
    }
    fclose($fh);
    return $count > 1;
}
?>
3
ответ дан 1 December 2019 в 17:37
поделиться

Прочтите спецификацию GIF89A и извлеките информацию. http://www.w3.org/Graphics/GIF/spec-gif89a.txt

Или просто, ленивый и готовый к взлому используйте программу intergif, которая может извлекать отдельные изображения из анимированного gif. Распакуйте во временный каталог и посмотрите, сколько файлов у вас получится. http://utter.chaos.org.uk/~pdh/software/intergif/download.htm

2
ответ дан 1 December 2019 в 17:37
поделиться

I'm no GIF file format expert, but this is an interesting problem to me so I looked into it a bit. This would work only if it's always true that animated gifs have the value NETSCAPE2.0 at position 0x310 (edit)AND static gifs do not,(/edit) which was the case in my test files. This is C#, if you want I could compile it to a console app that takes a directory as an argument and you could run some test on your very large gif collection to see if it produces reliable results.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string ani = @"C:\path\to\ani.gif";
            string sta = @"C:\path\to\static.gif";

            Console.WriteLine(isAnimated(ani));
            Console.WriteLine(isAnimated(sta));
        }

        static bool isAnimated(string path)
        {
            byte[] bytes = File.ReadAllBytes(path);
            byte[] netscape = bytes.Skip(0x310).Take(11).ToArray();

            StringBuilder sb = new StringBuilder();

            foreach (var item in netscape)
            {
                sb.Append((char)item);
            }

            return sb.ToString() == "NETSCAPE2.0";
        }
    }
}
2
ответ дан 1 December 2019 в 17:37
поделиться

попробуйте это

import Image

def checkAnimate():
    im = Image.open('image.gif')
    if not im.info['version'].__contains__('GIF'):
        print "It's not a GIF file"
    else:
        if im.info.has_key('duration'):
            if im.info['duration'] > 0:
                return True
            else:
                return False
        else:
            return False
0
ответ дан 1 December 2019 в 17:37
поделиться

посмотрите, есть ли в GIF-файле более одного LocalDescriptor.

1
ответ дан 1 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: