Nasıl programlı bir GIF görüntü hareketli olup olmadığını kontrol edebilirim?

8 Cevap php

İşte another question Ben üzerinde çalışıyorum aynı proje ile ilgili sorulan bir bağlantıdır. Ben arka plan bu biraz yardımcı olacağını düşünüyorum.

Bu soruya yeni bir sekme açmak için çok tembel olanlar için, ben burada yapmak ne çalışıyorum özetlemek olacak: Ben 4scrape yaklaşık 250,000 görüntüleri indirdiğiniz ve GIF geçmesi ve hangilerinin hangi bulmak istiyorum animasyonlu ya da değil. Gerçekten benim ruh (ya da benim kız arkadaşım ile benim ilişki) hissetmiyorum çünkü onlar animasyonlu veya olup olmadığını görmek için 4chan bir kaç bin GIF bakarak kullanabilirsiniz, programlı bunu yapmak gerekir. Eğer 4chan doğasını bilmek, o zaman görüntüleri (yani "memeler veya GTFO") doğasını biliyoruz.

Ben PHP ve Python biliyorum, ama başka çözümler keşfetmek için istekli olacaktır. Windows üzerinde çalışan bir yazılım tek başına parçası da çalışmaya devam eder.

Thanks a lot!

8 Cevap

Python ile ve PIL:

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

Linux (veya ImageMagick ile herhangi bir sistem) bir one-liner shell script ve identify programı kullanabilirsiniz iseniz:

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

Ben size PHP ve Python tercih söyledi biliyorum, ama aynı zamanda başka çözümler keşfetmek için istekli olduğunu söyledi. :)

Sana bu anlatacağım bir program görmedim. Ama GIF bir blok yapılı biçimi ve animasyonlu GIF belirten blok dosyaların mevcut olup olmadığını kontrol edebilirsiniz.

Wikipedia makale aşağıda belirtilmiştir: offset 0x30D bir Uygulama Uzantısı (örn: 3 byte sihirli sayı 21 FF 0B) sihirli sayı 4E 45 54 53 43 41 50 45 32 9AT ardından GIF dosyasında blok gösterir 0x310 ofset, geri kalan dosya birden görüntüler içeriyor ve bunlar hareketli olmalıdır.

Gerçekten Wikipedia makale daha iyi açıklıyor ve aşağıda belirtilen biçim docs Wiki makale genişletin.

Yani (Ben ağırlıklı etrafında dosya işaretçisi hareket ve bayt okuma bir egzersiz oldu, yıllar önce C kullanarak GIF çözümlenen) Python ile yazılmış bir program kullanarak GIF ayrıştırmak. AE doğru 3 bayt kimliği ile mevcut olup olmadığını belirlemek ve 9 bayt sihirli sayısına göre izledi.

Bkz http://en.wikipedia.org/wiki/Graphics%5FInterchange%5FFormat#Animated%5F.gif

Ayrıca bkz: http://www.martinreddy.net/gfx/2d/GIF87a.txt

Ayrıca bkz: http://www.martinreddy.net/gfx/2d/GIF89a.txt

Üzgünüm, iyi ben sizin için ne yapabilirim.

Birkaç çözeltiler imagecreatefromgif fonksiyon için PHP docs sayfasında verilmektedir.

Ben okudum çözümleri, bu nedeniyle sıkı bellek gereksinimleri için en iyi görünüyor.

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

Ben hiçbir GIF dosya biçimi uzman değilim, ama bu yüzden içine biraz baktım benim için ilginç bir sorundur. Bu animasyonlu gif pozisyonu 0x310 (edit) de değer NETSCAPE2.0 sahip VE statik gif olmadığını hep doğrudur yalnızca çalışmak istiyorsunuz, benim test dosyaları olduğu (/ edit). Eğer ben bir argüman olarak bir dizin alır ve güvenilir sonuçlar üretir olmadığını görmek için çok büyük gif koleksiyonunda bazı test çalıştırabilir bir konsol uygulaması için derlemek olabilir isterseniz bu, C #.

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

Birden fazla LocalDescriptor GIF dosyasında orada olan olup olmadığını görmek.

Bu deneyin

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