support - test gd php



Puis-je détecter les gifs animés en utilisant php et gd? (4)

Je suis actuellement confronté à quelques problèmes de redimensionnement d'images en utilisant GD.

Tout fonctionne bien jusqu'à ce que je veux redimensionner un gif animé, qui fournit la première image sur un fond noir.

J'ai essayé d'utiliser getimagesize mais cela ne me donne que des dimensions et rien à distinguer entre n'importe quel gif et un gif animé.

Le redimensionnement réel n'est pas requis pour les gifs animés, juste pouvoir les ignorer suffirait à nos fins.

Des indices?

PS. Je n'ai pas accès à imagemagick.

Sincères amitiés,

Kris

https://code.i-harness.com


Voici la fonction de travail:

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

GIF animé doit avoir la chaîne suivante

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

La lecture d'un fichier entier avec file_get_contents peut prendre trop de mémoire si le fichier donné est trop volumineux. J'ai re-factorisé la fonction précédemment donnée qui lit juste assez d'octets pour vérifier les trames et retourne dès qu'elle trouve au moins 2 trames.

<?php
/**
 * Detects animated GIF from given file pointer resource or filename.
 *
 * @param resource|string $file File pointer resource or filename
 * @return bool
 */
function is_animated_gif($file)
{
    $fp = null;

    if (is_string($file)) {
        $fp = fopen($file, "rb");
    } else {
        $fp = $file;

        /* Make sure that we are at the beginning of the file */
        fseek($fp, 0);
    }

    if (fread($fp, 3) !== "GIF") {
        fclose($fp);

        return false;
    }

    $frames = 0;

    while (!feof($fp) && $frames < 2) {
        if (fread($fp, 1) === "\x00") {
            /* Some of the animated GIFs do not contain graphic control extension (starts with 21 f9) */
            if (fread($fp, 1) === "\x2c" || fread($fp, 2) === "\x21\xf9") {
                $frames++;
            }
        }
    }

    fclose($fp);

    return $frames > 1;
}





gd