Crop di immagini da una cartella

  • Creatore Discussione Creatore Discussione mm88
  • Data di inizio Data di inizio

mm88

Nuovo Utente
30 Ott 2008
14
0
0
Ciao a tutti, vorrei che il mio script leggesse tutte le immagini presenti in una cartella e che le visualizzasse dopo averle ritagliate.

sto utilizzando questo script:

Codice:
$nw=50; //The Width Of The Thumbnails
$nh=50; //The Height Of The Thumbnails

$ipath = "pics/"; //Path To Place Where Images Are Uploaded. No Trailing Slash
$tpath = "pics/thumbnails";//Path To Place Where Thumbnails Are Uploaded. No Trailing Slash

$img_name = $ipath."img1.jpg";

$dimensions = GetImageSize($img);

//$thname = "$tpath/$img_name";
$thname = "$img_name";

$w=$dimensions[0];
$h=$dimensions[1];

$img2 = ImageCreateFromJpeg($img);
$thumb=ImageCreateTrueColor($nw,$nh);
	
$wm = $w/$nw;
$hm = $h/$nh;
	
$h_height = $nh/2;
$w_height = $nw/2;
	
if($w > $h){
	
	$adjusted_width = $w / $hm;
	$half_width = $adjusted_width / 2;
	$int_width = $half_width - $w_height;
	
	ImageCopyResampled($thumb,$img2,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h); 
	ImageJPEG($thumb,$thname,95); 
	
}elseif(($w < $h) || ($w == $h)){
	
	$adjusted_height = $h / $wm;
	$half_height = $adjusted_height / 2;
	$int_height = $half_height - $h_height;
	
	touch($thname);
	ImageCopyResampled($thumb,$img2,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h); 
	ImageJPEG($thumb,$thname,95); 
	
}else{
	ImageCopyResampled($thumb,$img2,0,0,0,0,$nw,$nh,$w,$h); 	
	ImageJPEG($thumb,$thname,95); 
}

imagedestroy($img2);
?>


tuttavia utilizzando un:

echo "<img src=\"$thumb\">";

Non ottengo l'output dell'immagine. La cartella "thumbnails" sul server è vuota e, verificando la variabile $thumb, mi restituisce un "Resource id #6".


Come faccio a visualizzare l'immagine croppata?

grazie
 
È perché non puoi utilizzare la variabile specificata come vorresti, perché $thumb contiene la risorsa creata dalle GD, come un riferimento all'immagine. Per visualizzarla devi usare imagejpeg, e per creare un link devi inserirlo necessariamente "a mano" o comunque con un ciclo while.
 
È perché non puoi utilizzare la variabile specificata come vorresti, perché $thumb contiene la risorsa creata dalle GD, come un riferimento all'immagine. Per visualizzarla devi usare imagejpeg, e per creare un link devi inserirlo necessariamente "a mano" o comunque con un ciclo while.


Ti ringrazio per la risposta.

Mi potresti gentilmente indicare come modificare lo script ?


grazie
 
ti basta associare:
PHP:
ImageJPEG($thumb,$thname,95);
ad una variabile e utilizzare questa come valore da stampare
 
No, veramente dovresti prima impostare gli header necessari e poi visualizzare l'immagine senza il tag img, perché la funzione ti restituisce il contenuto dell'immagine.

Ho cercato in rete un riferimento a quanto mi dici, ma sono confuso. Non sono un utilizzatore di PHP al tuo livello.

In pratica, l'header è già stato inviato ad apertura di pagina, giusto? Devo azzerarlo e modificarlo?

Come faccio?

Se non hai tempo per scrivere il codice, linkami un tutorial.

grazie
 
Ultima modifica:
Per header viene inteso tutto quello che viene inviato al server riguardante il tipo di contenuto della pagina, la gestione della cache, etc.


Dunque, ho letto il tutorial e alla fine del mio codice ho aggiunto:

Codice:
header("Content-type: image/jpeg"); 
imagejpeg($img); *

Tuttavia l'output mi dà:

Cannot modify header information - headers already sent by (output started at /web/htdocs/....

e

Warning: imagejpeg(): supplied argument is not a valid Image resource in /web/htdocs/...


Per quale motivo?

Come faccio allora a modificare l'header?

grazie
 
Ma la variabile $img cosa contiene?

Gentilmente, un passo alla volta.

Sto utilizzando sempre il codice che leggi nel mio primo post.

Mi hai gentilmente detto di modificare gli header, ho inserito header("Content-type: image/jpeg"); prima di distruggere l'immagine, e mi dà quell'errore.

Per quale motivo?

Sono sicuro che se provassi il codice, capiresti subito il problema.

Io avevo semplicemente bisogno di uno script che leggesse tutte le immagini presenti in una cartella e me restituisse tagliate (in base ad una dimensione definita).

Ho cercato in giro, ma ho trovato solo script che creano thumbnail non croppate. Oppure azioni di crop su immagini singole.


grazie
 
Ma da quanto leggo dallo script che c'è nel primo post la variabile $img non è definita, forse hai sbagliato il nome.

Come ho già scritto, non so come richiamare l'immagine.

$img sarà la variabile sbagliata da richiamare, ma l'errore sull header me lo dà lo stesso.
 
Te lo da perché le librerie GD visualizzano l'errore e quindi inviano un header visualizzando quel testo. Se non comparisse l'errore non ci sarebbe neanche quello dell'header ;)


Ok. L'utente Eliox consigliava di associare ImageJPEG($thumb,$thname,95); ad una variabile e utilizzare questa come valore da stampare.

provando con:

Codice:
$img = ImageJPEG($thumb,$thname,95); *
echo "<img src=\"$img\">";

mi restituisce un syntax error, unexpected T_ECHO


Come posso fare?


grazie
 
Ultima modifica:
Però imparate ad interpretare gli errori di PHP. Dopotutto se hanno messo un interprete che ti dice dove hai sbagliato un motivo ci sarà, no? E ti assicuro che dei report sugli errori dettagliati come quelli di PHP non li troverai in nessun altro linguaggio!

Comunque, tornando al tuo problema: che cosa ci fa quell'asterisco lì? Toglilo.
 
Però imparate ad interpretare gli errori di PHP. Dopotutto se hanno messo un interprete che ti dice dove hai sbagliato un motivo ci sarà, no? E ti assicuro che dei report sugli errori dettagliati come quelli di PHP non li troverai in nessun altro linguaggio!

Comunque, tornando al tuo problema: che cosa ci fa quell'asterisco lì? Toglilo.


Ho evidentemente copiato male, perché - a quello ci arrivo - quell'asterisco non ci va.

In ogni caso, sei gentilissimo, ma non capisco perché tu risponda solo ad una parte della domanda

Ho seguito le tue indicazioni, ma L'immagine non viene visualizzata utilizzando

Codice:
header("Content-type: image/jpeg");

$img = ImageJPEG($thumb,$thname,95);

echo "<img src=\"$img\">";


mi ridà Warning: Cannot modify header information - headers already sent by (output started at


Puoi gentilmente riportare il codice corretto per visualizzare l'immagine?

grazie
 
Ti ho già spiegato che non puoi inviare una stringa dopo aver impostato gli header per visualizzare un'immagine, ti pare? Devi fare così:
PHP:
imagejpeg($thumb, $thname, 95);
echo "<img src=\"{$thname}\" />";
Con questo codice visualizzi l'anteprima a qualità 95% e la salvi in un file che avrà il nome contenuto nella variabile $thname.
 
Ultima modifica:
Ti ho già spiegato che non puoi inviare una stringa dopo aver impostato gli header per visualizzare un'immagine, ti pare? Devi fare così:
PHP:
imagejpeg($thumb, $thname, 95);
echo "<img src=\"{$thname}\" />";
Con questo codice visualizzi l'anteprima a qualità 95% e la salvi in un file che avrà il nome contenuto nella variabile $thname.


Ti ho già spiegato che non puoi inviare una stringa dopo aver impostato gli header per visualizzare un'immagine, ti pare? Devi fare così:
PHP:
imagejpeg($thumb, $thname, 95);
echo "<img src=\"{$thname}\" />";
Con questo codice visualizzi l'anteprima a qualità 95% e la salvi in un file che avrà il nome contenuto nella variabile $thname.



Ecco, per esempio non conosco l'utilizzo di quelle parentesi graffe dentro cui c'è la variabile. Per questo ti chiedevo di farmi un esempio pratico.



Il mio script attualmente è questo:


Codice:
<?
$nw=50; //The Width Of The Thumbnails
$nh=50; //The Height Of The Thumbnails

$ipath = "pics/"; //Path To Place Where Images Are Uploaded. No Trailing Slash
$tpath = "pics/thumbnails";//Path To Place Where Thumbnails Are Uploaded. No Trailing Slash

$img_name = $ipath."img1.jpg";

$dimensions = GetImageSize($img);

//$thname = "$tpath/$img_name";
$thname = "$img_name";

$w=$dimensions[0];
$h=$dimensions[1];

$img2 = ImageCreateFromJpeg($img);
$thumb=ImageCreateTrueColor($nw,$nh);
	
$wm = $w/$nw;
$hm = $h/$nh;
	
$h_height = $nh/2;
$w_height = $nw/2;
	
if($w > $h){
	
	$adjusted_width = $w / $hm;
	$half_width = $adjusted_width / 2;
	$int_width = $half_width - $w_height;
	
	ImageCopyResampled($thumb,$img2,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h); 
	ImageJPEG($thumb,$thname,95); 
        echo "<img src=\"{$thname}\">";
	
}elseif(($w < $h) || ($w == $h)){
	
	$adjusted_height = $h / $wm;
	$half_height = $adjusted_height / 2;
	$int_height = $half_height - $h_height;
	
	touch($thname);
	ImageCopyResampled($thumb,$img2,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h); 
	ImageJPEG($thumb,$thname,95); 
        echo "<img src=\"{$thname}\">";
	
}else{
	ImageCopyResampled($thumb,$img2,0,0,0,0,$nw,$nh,$w,$h); 	
	ImageJPEG($thumb,$thname,95); 
        echo "<img src=\"{$thname}\">";
}

imagedestroy($img2);
?>


Ho inserito quindi l'echo che mi hai suggerito nei vari casi dell'IF.
Purtroppo però mi restituisce un banale errore di sintassi "syntax error, unexpected "}" in..." alla linea in cui ho aggiunto gli echo.

Come mai?


grazie
 
Le parentesi graffe all'interno di una stringa servono per processare variabili senza il rischio che il loro nome si mescoli con il resto della stringa da visualizzare. Personalmente le uso sempre per evitare macelli dal principio. Mi sembra strano che ti restituisca un errore, in ogni caso ho fatto qualche correzione al tuo script. Ecco qualche consiglio:
  1. Non usare mai i tag di apertura corti, alcuni server non li riconoscono.
  2. I nomi delle funzioni in PHP sono sempre minuscoli, non scriverle come meglio credi.
  3. Quando assegni ad una variabile il valore di un'altra variabile, o quando devi visualizzare solo una variabile non servono le virgolette.
  4. Non usare le parentesi negli if per espressioni che starebbero bene anche senza.
  5. Distanzia sempre, per leggibilità, i parametri che passi ad una funzione dando uno spazio dopo le virgole.
Ecco il tuo script corretto, ma non sono sicuro che così sia risolto il problema delle parentesi:
PHP:
<?php
$nw = 50; // larghezza delle anteprime
$nh = 50; // altezza delle anteprime

$ipath = 'pics'; // directory in cui inserire le immagini senza slash finale.
$tpath = 'pics/thumbnails'; // directory in cui inserire le anteprime senza slash finale.

$img_name = "{$ipath}img1.jpg";
$dimensions = getimagesize($img);

$thname = $img_name;

list($w, $h) = $dimensions;

$img2 = imagecreatefromjpeg($img);
$thumb = imagecreatetruecolor($nw,$nh);
	
$wm = $w / $nw;
$hm = $h / $nh;
	
$h_height = $nh / 2;
$w_height = $nw / 2;
	
if($w > $h)
{
	$adjusted_width = $w / $hm;
	$half_width = $adjusted_width / 2;
	$int_width = $half_width - $w_height;
	
	imagecopyresampled($thumb, $img2, -$int_width, 0, 0, 0, $adjusted_width, $nh, $w, $h); 
	imagejpeg($thumb, $thname, 95); 
	echo "<img src=\"{$thname}\" />";
}
elseif(($w < $h) || ($w == $h))
{
	$adjusted_height = $h / $wm;
	$half_height = $adjusted_height / 2;
	$int_height = $half_height - $h_height;
	
	touch($thname);
	imagecopyresampled($thumb, $img2, 0, -$int_height, 0, 0, $nw, $adjusted_height, $w, $h); 
	imagejpeg($thumb, $thname, 95); 
	echo "<img src=\"{$thname}\" />";
}
else
{
	imagecopyresampled($thumb, $img2, 0, 0, 0, 0, $nw, $nh, $w, $h); 	
	imagejpeg($thumb, $thname, 95); 
	echo "<img src=\"{$thname}\" />";
}

imagedestroy($img2);
?>
 

Discussioni simili