В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на одно и то же место в памяти.
Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object и переопределяет этот метод, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.
Оператор
==
проверяет, являются ли две строки точно одним и тем же объектом.Метод
blockquote>.equals()
проверяет, имеют ли две строки одно и то же значение.
С Python и PIL :
from PIL import Image
gif = Image.open('path.gif')
try:
gif.seek(1)
except EOFError:
isanimated = False
else:
isanimated = True
Если вы работаете в Linux (или любой системе с ImageMagick ), вы можете использовать однострочный сценарий оболочки и идентифицировать
программу:
identify *.gif | fgrep '.gif[1] '
Я знаю, что вы сказали, что предпочитаете PHP и Python, но вы также сказали, что готовы изучить другие решения. :)
Я никогда не видел программы, которая сообщила бы вам это. Но 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-байтовым идентификатором,
Некоторые решения приведены в документации 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;
}
?>
Прочтите спецификацию GIF89A и извлеките информацию. http://www.w3.org/Graphics/GIF/spec-gif89a.txt
Или просто, ленивый и готовый к взлому используйте программу intergif, которая может извлекать отдельные изображения из анимированного gif. Распакуйте во временный каталог и посмотрите, сколько файлов у вас получится. http://utter.chaos.org.uk/~pdh/software/intergif/download.htm
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";
}
}
}
попробуйте это
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
посмотрите, есть ли в GIF-файле более одного LocalDescriptor.