applicare filigrana ad una miniatura

mediasteno

Utente Attivo
25 Gen 2010
120
0
0
Devo inserire un'immagine in un database, mi creo la miniatura e ad essa applicare una filigrana ossia il link del sito web. Ho realizzare il seguente script:
PHP:
        if(is_uploaded_file($img))                 //controllo se l'immagine è stata recuperata
            {
               $nome_img = strtolower ($alt);
               $nome_img = stripslashes ($alt);
               $nome_img = ereg_replace (" ", "_", $nome_img );
               $nome_img = ereg_replace ("'", "", $nome_img );
               $thumbs = "imgfoto/"; // directory di salvataggio delle miniature create
               $new_img = 'imgfoto/'."$nome_img".'.jpg';

               list($width, $height) = getimagesize($img);       //recupero le dimensioni dell'immagine orginale
               //dimensioni dell'immagine da creare
               $thumbWidth = 450; // larghezza
               $thumbHeight = 250; // altezza
               $thumbscale = min($thumbWidth / $width, $thumbHeight / $height);
               $new_width = floor($thumbscale * $width);
               $new_height = floor($thumbscale * $height);
                   /*creo una nuova immagine più piccola*/
               $tmp_img = @imagecreatetruecolor ($new_width, $new_height) or die ("Impossibile salvare l'immagine");
               $image = @imagecreatefromjpeg($img) or die ("L'immagine deve essere in jpeg ".mysql_error());
               imagecopyresampled($tmp_img, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height) or die ("Impossibile ridimensionare l'immagine");
               imagejpeg($tmp_img, $new_img, 100) or die ("qui errore");
               /*ho l'immagine in miniatura $new_img*/
               /*recupero l'immagine filigrana*/
               $filigrana = 'pic/filigrana.gif';
               $wtimg = imagecreatefromgif($filigrana);

               /*sovrappongo le due immagini*/
               @imagecopymerge($new_img, $wtimg, 0, 0, 0, 0, $dimensione[0], $dimensione[1], 100);
               @header("content-type: image/jpeg");
               $img_foto="<img src=$wtimg>";

               @imagedestroy($tmp_img);
               @imagedestroy($img_modificata);
            }
             else {echo "Nessuna immagine inserita<br />";}

non ho alcun problema con la miniatura. Il mio problema sta nella parte di script che applica l'immagine gif all'immagine jpg. Nel sito web mi inserisce il link <img src=Resource id #14> e non riesco a capire dove sbaglio.
 
Sbagli perché la variabile $wtimg è una risorsa, non è l'URL della nuova immagine. Quindi l'unico modo con cui puoi risolvere è modificare questa parte:
PHP:
@header("content-type: image/jpeg");
$img_foto="<img src=$wtimg>";
In questa maniera:
PHP:
$img_foto = "<img src=\"{$new_img}\" />";
 
conviene inserire gli operatori di silence (@) solo quando si è sicuri che lo script funziona pefettamente
 
Correggendo lo script secondo le indicazioni di Alessandro1997 ottengo la foto in miniatura e non ho più l'errore nel database. Ma non ho l'immagine con il logo.
Ho anche modificato lo script in questo modo:
PHP:
       if(is_uploaded_file($img))                 //controllo se l'immagine è stata recuperata
            {
               $nome_img = strtolower ($alt);
               $nome_img = stripslashes ($alt);
               $nome_img = ereg_replace (" ", "_", $nome_img );
               $nome_img = ereg_replace ("'", "", $nome_img );
               $thumbs = "imgfoto/"; // directory di salvataggio delle miniature create
               $img_base = 'imgfoto/'."$nome_img".'.jpg';
               $img_wtm = 'pic/filigrana.gif';
               $img_logo  =  imagecreatefromgif($img_wtm);
               
               list($width, $height) = getimagesize($img);       //recupero le dimensioni dell'immagine orginale
               //dimensioni dell'immagine da creare
               $thumbWidth = 450; // larghezza
               $thumbHeight = 250; // altezza
               $thumbscale = min($thumbWidth / $width, $thumbHeight / $height);
               $new_width = floor($thumbscale * $width);
               $new_height = floor($thumbscale * $height);
               /*creo una nuova immagine più piccola*/
               $img_small = @imagecreatetruecolor ($new_width, $new_height) or die ("Impossibile salvare l'immagine");
               /*sovrappongo le due immagini */
               $image = @imagecreatefromjpeg($img) or die ("L'immagine deve essere in jpeg ".mysql_error());
               @imagecopy ( $img_logo, $img_base, 0, 0, 0, 0, $new_width, $new_height ) or die ("Impossibile inserire il logo");

               imagecopyresampled($img_small, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height) or die ("Impossibile ridimensionare l'immagine");
               imagejpeg($img_small, $img_base, 100) or die ("qui errore");
               
               /*ho l'immagine in miniatura $img_foto*/
               $foto="<img src=\"{$img_foto}\" />";
               @imagedestroy($img_small);
               @imagedestroy($img_logo);
            }
             else {echo "Nessuna immagine inserita<br />";}

ma anche in questo modo non risolvo il problema. Avendo inserito die ho "Impossibile inserire il logo". Quindi forse sbaglio in

PHP:
@imagecopy ( $img_logo, $img_base, 0, 0, 0, 0, $new_width, $new_height ) or die ("Impossibile inserire il logo");
 
eliminando @ ho individuato che il problema riguarda i parametri di imagecopymerge. Ora ho il seguente messaggio:

Warning: imagecopymerge(): supplied argument is not a valid Image resource in /var/www/vhosts/adivades000005/httpdocs/inserimento_foto_.php on line 75
Impossibile applicare il logo

Leggendo su internet ho provato a crearmi l'immagine da sovrapporre direttamente con il php e per questo motivo il codice è il seguente:
...
PHP:
               /*ho l'immagine in miniatura $new_img*/
               /*ora mi creo la scritta da inserire sulla foto*/
               $logo = imagecreatetruecolor(100, 70);        /*imagecreatetruecolor crea l'immagine di base, parametri: lunghezza e altezza dell'immagine*/
               $textcolor = imagecolorallocate ($logo, 51, 0, 51); /*imagecolorallocate serve per definire i colori del testo e dei caratteri */
               imagestring($logo, 8, 10, 8, 'visitandoilmondo.it', $textcolor);   /*scrive una stringa sull'immagine. 8 è la grandezza del font, 10 è lo spazio dal bordo sinistro,  8 spazio dal bordo alto*/
               /*sovrapposizione delle due immagini*/
               imagecopymerge($new_img, $logo, 10, 10, 0, 0, 100, 47, 80) or die ("Impossibile applicare il logo");;
               imagejpg($new_img, 'photo.jpg');
               imagedestroy($new_img);
               
               $img_foto="<img src=\"photo.jpg\" />";
            }
             else {echo "Nessuna immagine inserita<br />";}

Da quanto ho capito il problema sta in una delle due immagini $logo oppure $new_img
 
$logo lo usi anche in imagestring() senza errori, probabile che il problema stia nell'altra variabile
 
Alla fine sono riuscita nell'intento. Ho messo su uno script che ridimensiona l'immagine che viene caricata attraverso un modulo e vi applica un'altra immagine, il logo. Ho usato un'immagine e non la creazione del testo tramite imagestring e imageallocatecolor poichè ho visto che con quest'ultima funzione ottengo uno sfondo nero ed io avevo bisogno di uno sfondo trasparente che non ottengo neanche utilizzando imageallocatecoloralpha.
Posto tutto lo script se per caso serve a qualcun altro:
PHP:
       if(is_uploaded_file($img))                 //controllo se l'immagine è stata recuperata
            {
               $nome_img = strtolower ($alt);
               $nome_img = stripslashes ($alt);
               $nome_img = ereg_replace (" ", "_", $nome_img );
               $nome_img = ereg_replace ("'", "", $nome_img );
               $thumbs = "imgfoto/"; // directory di salvataggio delle miniature create
               $new_img = 'imgfoto/'."$nome_img".'.jpg';
               list($width, $height) = getimagesize($img);       //recupero le dimensioni dell'immagine orginale
               //dimensioni dell'immagine da creare
               $thumbWidth = 450; // larghezza
               $thumbHeight = 250; // altezza
               $thumbscale = min($thumbWidth / $width, $thumbHeight / $height);
               $new_width = floor($thumbscale * $width);
               $new_height = floor($thumbscale * $height);
                   /*creo una nuova immagine più piccola*/
               $img_small = @imagecreatetruecolor ($new_width, $new_height) or die ("Impossibile salvare l'immagine");
               $image = @imagecreatefromjpeg($img) or die ("L'immagine deve essere in jpeg ".mysql_error());
               imagecopyresampled($img_small, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height) or die ("Impossibile ridimensionare l'immagine");
               imagejpeg($img_small, 'photo.jpg', 100) or die ("qui errore");
               imagedestroy($img_small);
               $img_pic = imagecreatefromjpeg('photo.jpg');
               /*ho l'immagine in miniatura $img_pic*/
               /*recupero il logo da inserire sulla foto*/
               $filigrana = 'pic/filigrana.gif';
               $logo = imagecreatefromgif($filigrana);
               /*sovrapposizione delle due immagini*/
               imagecopymerge($img_pic, $logo, 5, 5, 0, 0, 200, 50, 100) or die ("Impossibile applicare il logo");
               imagejpeg($img_pic, $new_img, 100);
               imagedestroy($img_pic);

               $img_foto='<img src='."$new_img".' />';
            }
             else {echo "Nessuna immagine inserita<br />";}
 
Grazie per aver postato il codice della soluzione, sarà utile a qualche altro utente:)
 

Discussioni simili