Ben php ve gd kullanarak animasyonlu gif algılayabilir miyim?

5 Cevap php

Şu anda GD kullanarak görüntüleri yeniden boyutlandırma bazı konularda çalıştırıyorum.

I siyah bir arka plan üzerinde ilk çerçeve sunan bir animasyonlu gif, yeniden boyutlandırmak istediğiniz kadar her şey gayet iyi çalışıyor.

I getimagesize kullanarak denedim ama bu sadece bana boyutları ve sadece herhangi bir gif ve animasyonlu bir biri arasında ayrım hiçbir şey verir.

Gerçek boyutlandırma sadece onları bizim amacımız için yeterli olacağını atlamak için güçlü olmak, animasyonlu gif için gerekli değildir.

Herhangi bir ipucu?

PS. Ben imagemagic'den erişimi yok.

Saygılarımızla,

Kris

5 Cevap

ImageCreateFromGif neye ihtiyacınız olmalıdır () fonksiyonları php manuel sayfa kod kısa bir pasajı var:

http://it.php.net/manual/en/function.imagecreatefromgif.php#59787

Ben php.net sitesi, Davide ve Kris başvuruyorsunuz koduna bir takip vardır, ancak, yazara göre fark aynı soruna bir çözüm ararken daha az bellek-yoğun, ve muhtemelen daha az disk-yoğun .

Bu ilgi çekici olabilir, çünkü ben, burada çoğaltmak gerekir.

Kaynak: http://www.php.net/manual/en/function.imagecreatefromgif.php#88005

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

Burada çalışma fonksiyonu bulunuyor:

/**
 * Thanks to ZeBadger for original example, and Davide Gualano for pointing me to it
 * Original at http://it.php.net/manual/en/function.imagecreatefromgif.php#59787
 **/
function is_animated_gif( $filename )
{
    $raw = file_get_contents( $filename );

    $offset = 0;
    $frames = 0;
    while ($frames < 2)
    {
    	$where1 = strpos($raw, "\x00\x21\xF9\x04", $offset);
    	if ( $where1 === false )
    	{
    		break;
    	}
    	else
    	{
    		$offset = $where1 + 1;
    		$where2 = strpos( $raw, "\x00\x2C", $offset );
    		if ( $where2 === false )
    		{
    			break;
    		}
    		else
    		{
    			if ( $where1 + 8 == $where2 )
    			{
    				$frames ++;
    			}
    			$offset = $where2 + 1;
    		}
    	}
    }

    return $frames > 1;
}

Martijn Heemels gelen cevap olarak, şu aşağıdaki gibi while satırdan sonra iki girintili hatları etrafında kaşlı ayraçlar olması gerektiğini söyleyerek duyuyorum?

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

Animasyonlu GIF zorunluluktur şu dize vardır

"\x21\xFF\x0B\x4E\x45\x54\x53\x43\x41\x50\x45\x32\x2E\x30"