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




프로그램 투명 (10)

파이썬과 PIL :

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

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

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

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

고마워요!



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

나는 당신에게 이것을 말할 프로그램을 본 적이 없다. 그러나 GIF는 블록 구조화 된 형식이므로 애니메이션 GIF를 나타내는 블록이 파일에 있는지 확인할 수 있습니다.

아래에 명시된 wikipedia 기사에서 : 오프셋 0x30D에서 GIF 파일의 응용 프로그램 확장 (예 : 3 바이트 매직 번호 21 FF 0B) 블록 다음에 매직 번호 4E가옵니다. 45 54 53 43 41 50 45 32 9at 오프셋 0x310은 파일에 여러 이미지가 포함되어 있으며 애니메이션으로 재생해야합니다.

실제로 Wikipedia 기사에서 더 잘 설명하고 아래 명시된 형식 문서가 Wiki 기사를 확장합니다.

그래서 파이썬으로 작성된 프로그램을 사용하여 GIF를 파싱 할 수 있습니다. (저는 수년 전에 C를 사용하여 GIF를 파싱했습니다. 주로 파일 포인터를 움직이고 바이트를 읽는 연습이었습니다). AE가 올바른 3 바이트 ID와 9 바이트 매직 넘버가 있는지 확인하십시오.

http://en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_.gif 참조하십시오 http://en.wikipedia.org/wiki/Graphics_Interchange_Format#Animated_.gif

http://www.martinreddy.net/gfx/2d/GIF87a.txt 참조하십시오 http://www.martinreddy.net/gfx/2d/GIF87a.txt

http://www.martinreddy.net/gfx/2d/GIF89a.txt 도 참조하십시오 http://www.martinreddy.net/gfx/2d/GIF89a.txt

미안, 내가 너를 위해서 할 수있어.


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

이 시도

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


ImageMagick 함수 getNumberImages가이를 처리합니다. 객체의 이미지 수를 반환하기 때문에. Imagick::getNumberImages

<?php

$image = new Imagick( YOUR_FILE );

if ( $image->getNumberImages() ) {
    echo "It's animated";
}

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

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

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


이 작업을 수행해야하는 경우

isinstance(<var>, int)

파이썬 2.x에 있지 않는 한 원하는 경우

isinstance(<var>, (int, long))

type 사용하지 마십시오. 다형성의 모든 융통성을 차단하기 때문에 파이썬에서 옳은 대답은 거의 없습니다. 예를 들어, int 를 서브 클래스 화한다면, 새로운 클래스는 int 로 등록해야합니다.

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

이것은 파이썬의 강력한 다형성을 고수합니다 : 하나가되도록 요구하는 대신 int 와 같이 동작하는 모든 객체를 허용해야합니다.

그러나

하지만 고전적인 파이썬 정신은 허가보다는 용서를 구하는 것이 더 쉽다는 것 입니다. 즉, x 가 정수인지 확인하지 마십시오. 그렇지 않으면 예외 결과를 catch한다고 가정합니다.

try:
    x += 1
except TypeError:
    ...

이러한 생각은 추상 기본 클래스를 사용하여 서서히 추월되고 있습니다.이 기본 클래스를 사용하면 특별히 생성 된 클래스에서 상속 받아 객체에 있어야 할 속성 (곱하기? 배가를 추가)을 정확하게 등록 할 수 있습니다. 이것이 가장 필요한 솔루션이 될 것입니다. 필요한 속성을 가진 객체를 정확하게 허용하기 때문입니다. 그러나 문서를 사용하는 방법을 읽어야합니다.





php python image