- Home
- Categorie
- Coding e Sistemistica
- Coding
- Aggiungere bordo ad una immagine con Lib. GD
-
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.
-
Allora, ho agito così:
function ApplicaBordo(&$imres){ $h = imagesy($imres)-1; $w = imagesx($imres)-1; $white = imagecolorallocate($imres, 255, 255, 255); $black = imagecolorallocate($imres, 0, 0, 0); imagerectangle($imres, 0, 0, $w, $h, $black); // Bordo composto da una linea esterna nera imagerectangle($imres, 1, 1, $w-1, $h-1, $white); // e da una linea interna bianca } $conbordo = ApplicaBordo($HTTP_POST_FILES['file']['tmp_name']); $nome1 = "".$tot_records."-".$nome_0.""; copy($conbordo,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1); unlink($HTTP_POST_FILES['file']['tmp_name']);
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(): supplied argument is not a valid Image resource in /home/vhosts/sito.it/var/www/html/dir/upload-save.php on line 123 Warning: imagesx(): 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.
-
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)
-
@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.
-
Mi sono spariti quei messaggi ma me ne è apparso uno di nuovo
Warning: copy(): Unable to access in /home/vhosts/skiforum.it/var/www/html/skiforum/upload-save.php on line 137
e la linea dice:
copy($conbordo,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1);
L'intero codice è il seguente:
function ApplicaBordo(&$imres){ $h = imagesy($imres)-1; $w = imagesx($imres)-1; $white = imagecolorallocate($imres, 255, 255, 255); $black = imagecolorallocate($imres, 0, 0, 0); imagerectangle($imres, 0, 0, $w, $h, $black); // Bordo composto da una linea esterna nera imagerectangle($imres, 1, 1, $w-1, $h-1, $white); // e da una linea interna bianca } $imres = @imagecreatefromjpeg($HTTP_POST_FILES['file']['tmp_name']); $conbordo = ApplicaBordo($imres); $nome1 = "".$tot_records."-".$nome_0.""; copy($conbordo,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1); # "home/vhosts/skiforum.it/var/www/html/skiforum/".$variabuleUpdload."/"; unlink($HTTP_POST_FILES['file']['tmp_name']);
Devo riapplicare imagecreatefromjpeg anche alla $conbordo e poi copiare quella?
()
-
No, niente da fare.
Non so più come fare per copiare la immagine coi bordini, rinominandola, nella cartella voluta
-
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.
-
Quindi devo modificare il mio codice in questo modo:
$imres = @imagecreatefromjpeg($HTTP_POST_FILES['file']['tmp_name']); $conbordo = ApplicaBordo($imres); $conbordo2 = imagejpeg ($conbordo,'',90); $nome1 = "".$tot_records."-".$nome_0.""; copy($conbordo2,"/home/vhosts/skiforum.it/var/www/html/skiforum/upload/".$categoria_foto."/".$nome1);
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
-
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...
-
@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.
-
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!