php - 효과 - GIF 이미지에 애니메이션이 적용되는지 여부를 프로그래밍 방식으로 확인하려면 어떻게해야합니까?




포토샵 투명 gif 만들기 (8)

여기 제가 작업하고있는 프로젝트와 관련하여 다른 질문에 대한 링크가 있습니다. 나는 약간의 배경이 도움이 될 것이라고 생각한다.

그 질문에 대해 새 탭을 열어보기가 너무 게으른 사람들을 위해 여기에서하려고하는 것을 요약 할 것입니다. 4 스크랩에서 약 25 만 개의 이미지를 다운로드했으며 GIF를 통해 원하는 이미지를 찾고 싶습니다. 생기있는 것 또는 그렇지 않은 것. 나는 내 넋 (또는 내 여자 친구와의 관계)이 4chan의 GIF 두 개를보고 애니메이션을하는지 아닌지를 볼 수 있다고 느끼지 않기 때문에 프로그래밍 방식으로이 작업을 수행해야합니다. 당신이 4chan의 본질을 아는 경우에, 당신은 심상 (ie "가슴 또는 GTFO")의 본질을 알고있다.

필자는 PHP와 Python을 알고 있지만 다른 솔루션을 찾아 볼 의향이 있습니다. Windows에서 작동하는 독립 실행 형 소프트웨어도 사용할 수 있습니다.

고마워요!

https://code.i-harness.com


GIF 파일에 둘 이상의 LocalDescriptor가 있는지 확인하십시오.



Linux (또는 ImageMagick 을 사용하는 시스템)를 사용하는 경우 한 줄짜리 쉘 스크립트를 identify 프로그램을 identify 있습니다.

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

PHP와 Python을 더 좋아한다고 말했지만, 다른 솔루션을 찾아 볼 의향이 있다고 말했습니다. :)


나는 GIF 파일 포맷 전문가는 아니지만 이것은 나에게 흥미로운 문제이므로 약간 살펴 보았다. 이것은 애니메이션 gif의 위치가 0x310 (편집)의 NETSCAPE2.0이고 테스트 파일의 정적 GIF (/ 편집)가 항상 true 인 경우에만 작동합니다. 이것은 C #입니다. 원하는 경우 디렉토리를 인수로 사용하는 콘솔 앱으로 컴파일하고 매우 큰 gif 컬렉션에 대한 테스트를 실행하여 신뢰할 수있는 결과가 나오는지 확인할 수 있습니다.

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

파이썬과 PIL :

from PIL import Image
gif = Image.open('path.gif')
try:
    gif.seek(1)
except EOFError:
    isanimated = False
else:
    isanimated = True

imagecreatefromgif 함수에 대한 PHP 문서 페이지에는 몇 가지 해결책이 제시되어 있습니다.

필자가 읽은 솔루션에서이 요구 사항은 엄격한 메모리 요구 사항으로 인해 가장 좋습니다.

<?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;
}
?>

from PIL import Image
fp = open('1.gif', 'rb')
im = Image.open(fp)
is_gif = bool(im.format and im.format.upper() == 'GIF')






image