Visualizzazione risultati 1 fino 14 di 14

Discussione: Creare gif animate con PHP

  1. #1
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito Creare gif animate con PHP

    Buongiorno a tutti,
    che voi sappiate è possibile creare gif animate sfruttando le librerie GD?

    Ho cercato in rete ed ho trovato questo:
    Codice PHP:
    <?php
    $imgsrc
    = imagecreatefromgif("Immagine1.gif");
    $imgwm = imagecreatefromgif("Animazione1.gif");
    imagecopy($imgsrc, $imgwm, 10, 10, 0, 0, imagesx($imgwm), imagesy($imgwm));
    Header("Content-Type: image/gif");
    imagegif($imgsrc);
    ?>
    Che però non da l'animazione alla gif, cioè sovrappone due immagini ma una delle due, quella animata, non si muove.
    Ho sbagliato qualche modifica che ho apportato o non si possono creare gif animate con php e gd2?
    Apprezzi l'aiuto? Offrimi un caffè!

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,246

    Predefinito

    Il primo link su google ti fornisce una class per creare gif animate, con tanto di appropriato forum di supporto. Provala e chiedi li.

  3. #3
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Grazie dreadnaut è una classe molto utile però il problema e che questo script crea una gif animata partendo da varie frames poste in una cartella...ammettendo anche che io scomponga la mia gif in frames dopo come dovrei fare a mettere questa frames su un immagine non animata?
    Apprezzi l'aiuto? Offrimi un caffè!

  4. #4
    Guest

    Predefinito

    Mi sembra che le ultime versioni di photoshop permettano di aprire tutte le istanze delle gif animate.
    Sicuramente Image Ready e Flash lo fanno.


    ciao!

  5. #5
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Sicuramente debug hai ragione, perchè creo e modifico gif con l'unione (pensa) di Adobe PhotoShop e ImageReady CS (v8) però io voglio fare il tutto con PHP per questo ho chiesto...avrei bisogno di sovrappore una gif animata su una semplice immagine con PHP ma quello script di dreadnaut non fa proprio ciò che io voglio.
    Apprezzi l'aiuto? Offrimi un caffè!

  6. #6
    Guest

    Predefinito

    In teoria ma questo è un parere personale penso che si dovrebbero sovrapporre le immagini e poi dire che è un file gif animato.

    Però ripeto non ho trovato niente in merito ma penso funzioni così.

  7. #7
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Io nel codice che ho postato nel post #1 apro due immagine, una gif animata e una gif normale, le sovrappongo e mostro il risultato tramite un header gif.
    Credevo che header gif bastasse per far muovere l'immagine "sotto" cioè la gif animata ma invece mi sbagliavo, il codice prende solo la prima frame della gif animata al di sopra gli sovrappone la seconda immagine e mostra il risultato finale.
    Apprezzi l'aiuto? Offrimi un caffè!

  8. #8
    Guest

    Predefinito

    Se vuoi creare una gif animata, devi creare una gif animata!
    Non puoi pretendere di ottenere questo risultato senza il metodo suggerito da dreadnaut!

    Dovrai creare tutti i frame dell'animazione, quindi con le tue sovrapposizioni e gli effetti che vuoi, e poi usare il php.
    Non puoi, a quanto ho capito, fare tutto automaticamente.


    Ciao!

  9. #9
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Beh allora non avrei proprio postato.

    Come ho detto più volte partendo da una gif animata (pre-creata o creata al momento con la classe di dreadnaut) ho bisogno di sovrapporre questa gif su un immagine che l'utente caricherà temporaneamente nel mio spazio.

    Ora da quanto ho capito non possiamo fare tutto con un solo codice quindi che ne dite se uso la funzione createimagefromgd?
    Con la classe di Dreadnaut creo la gif animata e con un secondo codice sovappongo tutto!?
    Apprezzi l'aiuto? Offrimi un caffè!

  10. #10
    Guest

    Predefinito

    Allora, ciò che tu vuoi ottenere praticamente è di sovrappore una GIF animata ad un background statico?
    Scomponi la GIF nei vari frames, sovrapponi i frames al background, uno per uno, e poi ricrei la GIF partendo dalle immagini risultanti... è solo una mia supposizione sul momento però, nn so se si possa fare.

  11. #11
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Non credo che si possa fare, ma posto comunque il codice per un aiuto:
    Codice PHP:
    <?php
    include "GIFEncoder.class.php";
    /*
    Build a frames array from sources...
    */
    if ( $dh = opendir ( "frames/" ) ) {
    while (
    false !== ( $dat = readdir ( $dh ) ) ) {
    if (
    $dat != "." && $dat != ".." ) {
    $frames [ ] = "frames/$dat";
    $framed [ ] = 5;
    }
    }
    closedir ( $dh );
    }
    /*
    GIFEncoder constructor:
    =======================

    image_stream = new GIFEncoder (
    URL or Binary data 'Sources'
    int 'Delay times'
    int 'Animation loops'
    int 'Disposal'
    int 'Transparent red, green, blue colors'
    int 'Source type'
    );
    */
    $gif = new GIFEncoder (
    $frames,
    $framed,
    0,
    2,
    0, 0, 0,
    "url"
    );
    /*
    Possibles outputs:
    ==================

    Output as GIF for browsers :
    - Header ( 'Content-type:image/gif' );
    Output as GIF for browsers with filename:
    - Header ( 'Content-disposition:Attachment;filename=myanimation.gif');
    Output as file to store into a specified file:
    - FWrite ( FOpen ( "myanimation.gif", "wb" ), $gif->GetAnimation ( ) );
    */
    Header ( 'Content-type:image/gif' );
    echo
    $gif->GetAnimation ( );
    ?>
    GIFEncode.class.php
    Codice PHP:
    <?php
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFEncoder Version 2.0 by László Zsidi, http://gifs.hu
    ::
    :: This class is a rewritten 'GifMerge.class.php' version.
    ::
    :: Modification:
    :: - Simplified and easy code,
    :: - Ultra fast encoding,
    :: - Built-in errors,
    :: - Stable working
    ::
    ::
    :: Updated at 2007. 02. 13. '00.05.AM'
    ::
    ::
    ::
    :: Try on-line GIFBuilder Form demo based on GIFEncoder.
    ::
    :: http://gifs.hu/phpclasses/demos/GifBuilder/
    ::
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    */

    Class GIFEncoder {
    var
    $GIF = "GIF89a"; /* GIF header 6 bytes */
    var $VER = "GIFEncoder V2.05"; /* Encoder version */

    var $BUF = Array ( );
    var
    $LOP = 0;
    var
    $DIS = 2;
    var
    $COL = -1;
    var
    $IMG = -1;

    var
    $ERR = Array (
    ERR00=>"Does not supported function for only one image!",
    ERR01=>"Source is not a GIF image!",
    ERR02=>"Unintelligible flag ",
    ERR03=>"Does not make animation from animated GIF source",
    );

    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFEncoder...
    ::
    */
    function GIFEncoder (
    $GIF_src, $GIF_dly, $GIF_lop, $GIF_dis,
    $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod
    ) {
    if ( !
    is_array ( $GIF_src ) && ! is_array ( $GIF_tim ) ) {
    printf ( "%s: %s", $this->VER, $this->ERR [ 'ERR00' ] );
    exit (
    0 );
    }
    $this->LOP = ( $GIF_lop > -1 ) ? $GIF_lop : 0;
    $this->DIS = ( $GIF_dis > -1 ) ? ( ( $GIF_dis < 3 ) ? $GIF_dis : 3 ) : 2;
    $this->COL = ( $GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1 ) ?
    (
    $GIF_red | ( $GIF_grn << 8 ) | ( $GIF_blu << 16 ) ) : -1;

    for (
    $i = 0; $i < count ( $GIF_src ); $i++ ) {
    if (
    strToLower ( $GIF_mod ) == "url" ) {
    $this->BUF [ ] = fread ( fopen ( $GIF_src [ $i ], "rb" ), filesize ( $GIF_src [ $i ] ) );
    }
    else if (
    strToLower ( $GIF_mod ) == "bin" ) {
    $this->BUF [ ] = $GIF_src [ $i ];
    }
    else {
    printf ( "%s: %s ( %s )!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod );
    exit (
    0 );
    }
    if (
    substr ( $this->BUF [ $i ], 0, 6 ) != "GIF87a" && substr ( $this->BUF [ $i ], 0, 6 ) != "GIF89a" ) {
    printf ( "%s: %d %s", $this->VER, $i, $this->ERR [ 'ERR01' ] );
    exit (
    0 );
    }
    for (
    $j = ( 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) ), $k = TRUE; $k; $j++ ) {
    switch (
    $this->BUF [ $i ] { $j } ) {
    case
    "!":
    if ( (
    substr ( $this->BUF [ $i ], ( $j + 3 ), 8 ) ) == "NETSCAPE" ) {
    printf ( "%s: %s ( %s source )!", $this->VER, $this->ERR [ 'ERR03' ], ( $i + 1 ) );
    exit (
    0 );
    }
    break;
    case
    ";":
    $k = FALSE;
    break;
    }
    }
    }
    GIFEncoder::GIFAddHeader ( );
    for (
    $i = 0; $i < count ( $this->BUF ); $i++ ) {
    GIFEncoder::GIFAddFrames ( $i, $GIF_dly [ $i ] );
    }
    GIFEncoder::GIFAddFooter ( );
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFAddHeader...
    ::
    */
    function GIFAddHeader ( ) {
    $cmap = 0;

    if (
    ord ( $this->BUF [ 0 ] { 10 } ) & 0x80 ) {
    $cmap = 3 * ( 2 << ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 ) );

    $this->GIF .= substr ( $this->BUF [ 0 ], 6, 7 );
    $this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap );
    $this->GIF .= "!\377\13NETSCAPE2.0\3\1" . GIFEncoder::GIFWord ( $this->LOP ) . "\0";
    }
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFAddFrames...
    ::
    */
    function GIFAddFrames ( $i, $d ) {

    $Locals_str = 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) );

    $Locals_end = strlen ( $this->BUF [ $i ] ) - $Locals_str - 1;
    $Locals_tmp = substr ( $this->BUF [ $i ], $Locals_str, $Locals_end );

    $Global_len = 2 << ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 );
    $Locals_len = 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );

    $Global_rgb = substr ( $this->BUF [ 0 ], 13,
    3 * ( 2 << ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 ) ) );
    $Locals_rgb = substr ( $this->BUF [ $i ], 13,
    3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) );

    $Locals_ext = "!\xF9\x04" . chr ( ( $this->DIS << 2 ) + 0 ) .
    chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . "\x0\x0";

    if (
    $this->COL > -1 && ord ( $this->BUF [ $i ] { 10 } ) & 0x80 ) {
    for (
    $j = 0; $j < ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ); $j++ ) {
    if (
    ord ( $Locals_rgb { 3 * $j + 0 } ) == ( ( $this->COL >> 16 ) & 0xFF ) &&
    ord ( $Locals_rgb { 3 * $j + 1 } ) == ( ( $this->COL >> 8 ) & 0xFF ) &&
    ord ( $Locals_rgb { 3 * $j + 2 } ) == ( ( $this->COL >> 0 ) & 0xFF )
    ) {
    $Locals_ext = "!\xF9\x04" . chr ( ( $this->DIS << 2 ) + 1 ) .
    chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . chr ( $j ) . "\x0";
    break;
    }
    }
    }
    switch (
    $Locals_tmp { 0 } ) {
    case
    "!":
    $Locals_img = substr ( $Locals_tmp, 8, 10 );
    $Locals_tmp = substr ( $Locals_tmp, 18, strlen ( $Locals_tmp ) - 18 );
    break;
    case
    ",":
    $Locals_img = substr ( $Locals_tmp, 0, 10 );
    $Locals_tmp = substr ( $Locals_tmp, 10, strlen ( $Locals_tmp ) - 10 );
    break;
    }
    if (
    ord ( $this->BUF [ $i ] { 10 } ) & 0x80 && $this->IMG > -1 ) {
    if (
    $Global_len == $Locals_len ) {
    if (
    GIFEncoder::GIFBlockCompare ( $Global_rgb, $Locals_rgb, $Global_len ) ) {
    $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
    }
    else {
    $byte = ord ( $Locals_img { 9 } );
    $byte |= 0x80;
    $byte &= 0xF8;
    $byte |= ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 );
    $Locals_img { 9 } = chr ( $byte );
    $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
    }
    }
    else {
    $byte = ord ( $Locals_img { 9 } );
    $byte |= 0x80;
    $byte &= 0xF8;
    $byte |= ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );
    $Locals_img { 9 } = chr ( $byte );
    $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
    }
    }
    else {
    $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
    }
    $this->IMG = 1;
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFAddFooter...
    ::
    */
    function GIFAddFooter ( ) {
    $this->GIF .= ";";
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFBlockCompare...
    ::
    */
    function GIFBlockCompare ( $GlobalBlock, $LocalBlock, $Len ) {

    for (
    $i = 0; $i < $Len; $i++ ) {
    if (
    $GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } ||
    $GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } ||
    $GlobalBlock { 3 * $i + 2 } != $LocalBlock { 3 * $i + 2 }
    ) {
    return (
    0 );
    }
    }

    return (
    1 );
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GIFWord...
    ::
    */
    function GIFWord ( $int ) {

    return (
    chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    :: GetAnimation...
    ::
    */
    function GetAnimation ( ) {
    return (
    $this->GIF );
    }
    }
    ?>
    Apprezzi l'aiuto? Offrimi un caffè!

  12. #12
    Guest

    Predefinito

    Citazione Originalmente inviato da Zorinik Visualizza messaggio
    Allora, ciò che tu vuoi ottenere praticamente è di sovrappore una GIF animata ad un background statico?
    Scomponi la GIF nei vari frames, sovrapponi i frames al background, uno per uno, e poi ricrei la GIF partendo dalle immagini risultanti... è solo una mia supposizione sul momento però, nn so se si possa fare.
    E' quello che ho suggerito io...


    ciao!

  13. #13
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Il problema e come fare, cioè dovrei usare imagecopy() perchè ho sperimentato che imagecreatefromgd() non va bene perchè più o meno il risultato non cambia.
    Apprezzi l'aiuto? Offrimi un caffè!

  14. #14
    montebue non è connesso Utente giovane
    Data registrazione
    19-01-2010
    Messaggi
    36

    Predefinito

    miki92 ma poi sei riuscito nel tuo intento?

    Anche io dovrei sovrapporre una gif animata ad un'immagine (jpg)..ma ho il presentimento che non si possa fare. Perlomeno fare in modo che il risultato finale sia una nuova immagine animata. Altrimenti si fa con una pagina HTML in uscita..

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •