• Bannato User Attivo

    Aggiungere bordo ad una immagine con Lib. GD

    Ho questo scopo:
    faccio caricare una foto dal mio sito, faccio dei controlli, e poi dalla cartella temporanea la sposto sulla cartella definitiva.

    Faccio così

    $nome1 = "".$tot_records."-".$nome_0."";
    
    #QUI AGGIUNGO IL CODICE CHE CREA IL BORDO
    
    copy($HTTP_POST_FILES['file']['tmp_name'],"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1);
    
    unlink($HTTP_POST_FILES['file']['tmp_name']);
    

    Ecco vorrei che la foto prima di essere copiata dalla cartella temporanea fosse un po modificata. Mi piacerebbe per esempio aggiungere un bordo interno bianco di 2px ed uno nero di 3 px. Una volta che questa operazione è fatta si sposta la foto e si cancella quella nella cartella temporanea.

    Per fare ciò posso utilizzare le Librerie GD. Ho ricercato per la rete ed ho trovato questa pagina:
    http://php.html.it/articoli/leggi/930/immagini-dinamiche-le-estensioni-gd-in-php/2/

    Metto il codice per il riconoscimento della versione e la pagina mi risponde:

    Su questo sistema è presente la versione 2 delle librerie GD.
    

    poi aggiungo il codice per creare la immagine di prova (copio quel codice nella stessa pagina) e accidenti, l'immagine non mi appare ed invece mi compare questo messaggio:

    Warning: Cannot modify header information - headers already sent by (output started at /home/vhosts/skiforum.it/var/www/html/image-gd.php:8) in /home/vhosts/skiforum.it/var/www/html/image-gd.php on line 49
    ‰PNG 
    

    la linea 8 è la riga <?
    la linea 49 dice: header("Content-type: image/png");

    Allora, proseguendo per passi, come faccio a risolvere questo primo problema? E' solo per la manipolazione di immagini .png? In tal caso non mi interessa i nquanto faccio caricare solo gif e jpeg.

    Grazie.
    Non ho aperto un nuovo topic ma l'ho aggiunto qui. Anzi no, ne apro uno nuovo.


  • Bannato User Attivo

    Allora, ho agito così:

    function ApplicaBordo&#40;&$imres&#41;&#123;
      $h = imagesy&#40;$imres&#41;-1;
      $w = imagesx&#40;$imres&#41;-1;
    
      $white = imagecolorallocate&#40;$imres, 255, 255, 255&#41;;
      $black = imagecolorallocate&#40;$imres, 0, 0, 0&#41;;
    
      imagerectangle&#40;$imres, 0, 0, $w, $h, $black&#41;;   // Bordo composto da una linea esterna nera
      imagerectangle&#40;$imres, 1, 1, $w-1, $h-1, $white&#41;; // e da una linea interna bianca
    &#125;
    $conbordo = ApplicaBordo&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;&#41;;
    
    $nome1 = "".$tot_records."-".$nome_0."";
    
    copy&#40;$conbordo,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1&#41;;
    
    unlink&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;&#41;;
    

    Applico la funzione che crea il bordo all'immagine che c'è nella dir temporanea ed assegno alla variabile $conbordo l'immagine elaborata avente i bordi.

    Poi copio questa immagine coi bordini nella directory voluta con il nome voluto.
    Infine cancello la immagine nella directory temporanea.

    Ho provato a lanciare la pagina ma mi da questi errori 😞

    Warning: imagesy&#40;&#41;&#58; supplied argument is not a valid Image resource in /home/vhosts/sito.it/var/www/html/dir/upload-save.php on line 123
    
    Warning&#58; imagesx&#40;&#41;&#58; supplied argument is not a valid Image resource in /home/vhosts/sito.it/var/www/html/dir/upload-save.php on line 124
    

    Sbaglio a passare l'immagine? Non so come si applicano queste funzioni alle immagini.


  • User Attivo

    Alla funzione imagesx non devi passare il nome del file immagine ma un identificativo di immagine che puoi ottenere, ad esempio, con [url=http://it.php.net/manual/it/function.imagecreatefromjpeg.php]imagecreatefromjpeg (e vari altri)


  • Bannato User Attivo

    @margheritebianche said:

    Alla funzione imagesx non devi passare il nome del file immagine ma un identificativo di immagine che puoi ottenere, ad esempio, con [url=http://it.php.net/manual/it/function.imagecreatefromjpeg.php]imagecreatefromjpeg (e vari altri)
    Quindi mi basta, in teoria modificare lo script sopra così:

    $imres = @imagecreatefromjpeg($HTTP_POST_FILES['file']['tmp_name']);
    E dovrebbe funzionare.

    Provo subito,
    Grazie infinite.


  • Bannato User Attivo

    Mi sono spariti quei messaggi ma me ne è apparso uno di nuovo 😞

    Warning: copy&#40;&#41;&#58; Unable to access in /home/vhosts/skiforum.it/var/www/html/skiforum/upload-save.php on line 137
    

    e la linea dice:

    copy&#40;$conbordo,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1&#41;;
    

    L'intero codice è il seguente:

    function ApplicaBordo&#40;&$imres&#41;&#123;
      $h = imagesy&#40;$imres&#41;-1;
      $w = imagesx&#40;$imres&#41;-1;
    
      $white = imagecolorallocate&#40;$imres, 255, 255, 255&#41;;
      $black = imagecolorallocate&#40;$imres, 0, 0, 0&#41;;
    
      imagerectangle&#40;$imres, 0, 0, $w, $h, $black&#41;;   // Bordo composto da una linea esterna nera
      imagerectangle&#40;$imres, 1, 1, $w-1, $h-1, $white&#41;; // e da una linea interna bianca
    &#125;
    $imres = @imagecreatefromjpeg&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;&#41;;
    $conbordo = ApplicaBordo&#40;$imres&#41;;
    
    $nome1 = "".$tot_records."-".$nome_0."";
    
    copy&#40;$conbordo,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1&#41;;
    # "home/vhosts/skiforum.it/var/www/html/skiforum/".$variabuleUpdload."/";
    unlink&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;&#41;;
    
    

    Devo riapplicare imagecreatefromjpeg anche alla $conbordo e poi copiare quella? :mmm: ()


  • Bannato User Attivo

    No, niente da fare.
    Non so più come fare per copiare la immagine coi bordini, rinominandola, nella cartella voluta :arrabbiato:


  • User Attivo

    Per salvare devi usare la [url=http://it.php.net/manual/it/function.imagejpeg.php]imagejpeg.
    Cmq il bordo (anche doppio) lo puoi fare benissimo con i CSS.


  • Bannato User Attivo

    Quindi devo modificare il mio codice in questo modo:

    $imres = @imagecreatefromjpeg&#40;$HTTP_POST_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;&#41;;
    $conbordo = ApplicaBordo&#40;$imres&#41;;
    $conbordo2 = imagejpeg &#40;$conbordo,'',90&#41;;
    $nome1 = "".$tot_records."-".$nome_0."";
    
    copy&#40;$conbordo2,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1&#41;;
    

    Adesso anche $conbordo2 è un file immagine mentre prima non so che era.
    Come qualità dell'immagine quanto conviene mettere? 90 è sufficiente e senza creare grossi files?

    Una volta copiato $conbordo2 lo devo "distruggere" o si distrugge automaticamente?

    Lo provo subito.

    Assolutamente niente. Non ci riesco. Sono ripassato a due errori :arrabbiato:


  • User Attivo

    imagejpeg ha nel secondo parametro il nome del file da creare, quindi devi mettere il nome del file lì e NON fare la copy.
    Prova e segnala eventuali errori...


  • Bannato User Attivo

    @margheritebianche said:

    imagejpeg ha nel secondo parametro il nome del file da creare, quindi devi mettere il nome del file lì e NON fare la copy.
    Prova e segnala eventuali errori...Mi sono letto le funzioni ed ho visto che per fare ciò devo ricreare una jpeg e questo mi porta inevitabilemente ad una perdita di qualità della foto oppure alla creazione di grossissimi file (se metto qualità 100). Questo ho valutato non essere compatibile con le mie esigenze e con lo spazio web.

    Il vantaggio "estetico" del bordino e poi della scrittina (sarei passato a quella poi) non è compatibile con la perdita di qualità o con la creazione di files grossi.

    Già che ci sono, è allora possibile coi css fare i bordini "bicolore" ovvero 1 px esterno nero ed 1 px interno bianco? Apro nuova discussione o continuiamo qui?

    Grazie infinite per l'aiuto, spero la discussione possa essere utile lo stesso.


  • User Attivo

    Onestamente so che si può fare ma i CSS non li conosco bene ma magari basta prendere spunto da qualcosa già fatto, io ho visto qualcosa simile a quello che ti potrebbe servire in [url=http://www.huddletogether.com/projects/lightbox/]lightbox , c'è sia il bordino sia la scritta soto...

    Tieni conto che le GD hanno anche limiti di memoria e quindi sicuramente quella dei CSS é la soluzione migliore!