Newsgroup: it.comp.www.php
Titolo: Generatore Thumbnail

Salve a tutti,
sto scrivendo un pannello di controllo che permetta di comporre pagine 
html direttamente da una pagina internet. Ora mi sto accingendo a 
scrivere la parte del pannello che carichi le immagini e crei i link.
In particolare, una porzione di codice dovrebbe prendere l'immagine 
caricata, ridimensionarla appropriatamente e sovrapporvi una mask 
predefinita. Il codice in questione è il seguente:
<?php
// Immagini su cui lavorare
$mask['name'] = "img/thumb_mask.png";
$opened['name'] = "img/daaprire.jpg";
// Recupera le dimensioni della mask
$imagesize = getimagesize($mask['name']);
$mask['width'] = $imagesize[0];
$mask['height'] = $imagesize[1];
// Crea l'immagine in cui lavorare
$thumbnail['image'] = imagecreate($mask['width'], $mask['height']);
// Apre l'immagine di cui fare il thumbnail e ne ricava le dimensioni
$opened['image'] = imagecreatefromjpeg($opened['name']);
$imagesize = getimagesize($opened['name']);
$opened['width'] = $imagesize[0];
$opened['height'] = $imagesize[1];
// Calcola i rapporti delle due immagini (larghezza/altezza)
$mask['rapporto'] = $mask['width'] / $mask['height'];
$opened['rapporto'] = $opened['width'] / $opened['height'];
// Controlla se deve lavorare sull'altezza o sulla larghezza e calcola 
le nuove dimensioni
if($opened['rapporto'] > $mask['rapporto']) { // Lavora sull'altezza
	$thumbnail['height'] = $mask['height'];
	$thumbnail['width'] = $mask['height'] * $opened['rapporto'];
	$thumbnail['wshifting'] =  0 - (($thumbnail['width'] - $mask
['width']) / 2);
	$thumbnail['hshifting'] =  0 - (($thumbnail['height'] - $mask
['height']) / 2);
} else { // Lavora sulla larghezza
	$thumbnail['width'] = $mask['width'];
	$thumbnail['height'] = $mask['width'] * (1 / $opened['rapporto']);
	$thumbnail['wshifting'] =  0 - (($thumbnail['width'] - $mask
['width']) / 2);
	$thumbnail['hshifting'] =  0 - (($thumbnail['height'] - $mask
['height']) / 2);
}
// Effettua la sovrapposizione della mask sull'immagine ridimensionata
$thumbnail['resized'] = imagecopyresized($thumbnail['image'], $opened
['image'], $thumbnail['wshifting'], $thumbnail['hshifting'], 0, 0, $mask
['width'], $mask['height'], $opened['width'], $opened['height']);
$thumbnail['resized'] = imagecopyresized($thumbnail['image'], $mask
['image'], 0, 0, 0, 0, $mask['width'], $mask['height'], $mask['width'], 
$mask['height']);
// Salva il file modificato
imagejpeg($thumbnail['resized'],"img/thumbnailizzata.jpg",100);
?> 
Premetto che sarà la terza o la quarta volta che lavoro con le librerie 
GD, quindi non sono molto pratico.
Premetto che non sono convinto di questa riga:
$thumbnail['resized'] = imagecopyresized($thumbnail['image'], $mask
['image'], 0, 0, 0, 0, $mask['width'], $mask['height'], $mask['width'], 
$mask['height']);
in quanto temo che sovrascriva l'immagine invece che creare un altro 
livello, ma il mio problema è dopo. Quando infatti lo script richiama la 
funzione imagejpeg, viene restituito l'errore:
Warning: imagejpeg(): supplied argument is not a valid Image resource in 
/usr/home/unionforce-net/fanwars-
it/www/setec/controlpanel/betatest/masking.php on line 43
Qualche consiglio/idea? Mi sembra strano che dica che non è un'Image 
Resource quando è qualcosa generato sempre dalle librerie GD...
Grazie in anticipo!
-- 
Liuk - Cavaliere Jedi | Ex allievo della maestra Alkaid
Email: 
li...@fanwars.it
 - Home Page: 
http://www.fanwars.it
Padre mufhd0 che sei nei server, sia santificato il tuo
hostname, venga il tuo broadcast, sia fatta la tua
configurazione così in linux come in BSD. Dacci oggi il
nostro source quotidiano e rimetti a noi i nostri codici
come noi li rimettiamo ai nostri sviluppatori e non indurci
in segfault ma liberaci da Microsoft.

 Grazie in anticipo!
non ho letto il tuo codice ma io uso questo (se lo modifichi credo che
andra' bene)..
<?php
 header("Content-type: image/jpeg");
 // setta i valori di configurazione
 $new_width = 300;
 $new_height = 300;
 $transparency = 50;
 // setta id e ottiene la grandezza dell'immagini principale
 $image = imagecreatefromjpeg('main.jpg');
 $image_width = imagesx($image);
 $image_height = imagesy($image);
 $percent = $new_width/$image_width;
 if(($image_height * $percent) > $new_height) $percent =
$new_height/$image_height;
 $new_width = $image_width * $percent;
 $new_height = $image_height * $percent;
 // setta id e ottiene la grandezza dell'immagini di sfondo
 $original_back = imagecreatefromjpeg('ins.jpg');
 $back_width = imagesx($original_back);
 $back_height = imagesy($original_back);
 $back = imagecreatetruecolor($new_width, $new_height);
 imagecopyresampled($back, $original_back, 0, 0, 0, 0, $new_width,
$new_height, $back_width, $back_height);
 imagedestroy($original_back);
 $final = imagecreatetruecolor($new_width, $new_height);
 imagecopyresampled($final, $image, 0, 0, 0, 0, $new_width, $new_height,
$image_width, $image_height);
 imagecopymerge($final, $back, 0, 0, 0, 0, $new_width, $new_height, 25);
 imagejpeg($final);
?>
-- 
www.iuz-lab.info

 
Scusa, come funziona una cosa del genere? Devo passare alla funzione 
l'immagine da ridimensionare e mi ritorna l'immagine ridimensionata? O 
mi ritorna un'immagine nuova? Devo passare l'immagine alla funzione 
quando faccio l'upload dell'immagine?
Tnx

Vincio wrote:

no ma quello era un esempio di script non di funzione io la uso in questo
modo..
[showimage.php]
<?php
 header("Content-type: image/jpeg");
 // setta i valori di configurazione
 $new_width = 300;
 $new_height = 300;
 $transparency = 50;
 // setta id e ottiene la grandezza dell'immagini principale
 $image = imagecreatefromjpeg($_GET['img']);
 $image_width = imagesx($image);
 $image_height = imagesy($image);
 $percent = $new_width/$image_width;
 if(($image_height * $percent) > $new_height) $percent =
$new_height/$image_height;
 $new_width = $image_width * $percent;
 $new_height = $image_height * $percent;
 // setta id e ottiene la grandezza dell'immagini di sfondo
 $original_back = imagecreatefromjpeg($_GET['subimg']);
 $back_width = imagesx($original_back);
 $back_height = imagesy($original_back);
 $back = imagecreatetruecolor($new_width, $new_height);
 imagecopyresampled($back, $original_back, 0, 0, 0, 0, $new_width
$new_height, $back_width, $back_height);
 imagedestroy($original_back);
 $final = imagecreatetruecolor($new_width, $new_height);
 imagecopyresampled($final, $image, 0, 0, 0, 0, $new_width, $new_height
$image_width, $image_height);
 imagecopymerge($final, $back, 0, 0, 0, 0, $new_width, $new_height, 25);
 imagejpeg($final);
?>
[/showimage.php]
e poi richiamo la pagina come se fosse un'immagine..
<img src="showimage.php?img=main.jpg&subimg=trans.jpg">
dove main.jpg e' l'immagine principale e trans.jpg l'immagine che verra'
aggiunta in trasparenza (naturalmente a questo script va aggiunta un'po' di
gestione degli errori)..
-- 
www.iuz-lab.info

 andra' bene)..
Ti ringrazio per il tuo codice, ma il mio problema principale era 
lavorare con il canale di trasparenza dei PNG...
Alla fine spulciando qua e là sono riuscito ad arrivare a questa 
funzione che penso che possa esse utile anche a qualcun'altro, quindi la 
posto...
La dimensione dell'immagine finale coincide con quella della mask che 
viene specificata nella variabile.
La funzione riesce a lavorare su immagini PNG, GIF e JPEG.
Se non si passa il nome con cui salvare il thumbnail, ovviamente, 
l'immagine viene stampata su schermo.
Spero sia utile!
<?php
function thumbnailer($background_name, $thumbnail_name) {
 
	// Immagine predefinita di mask (formato PNG-24, con canale alpha)
	$mask_name = "img/thumb_mask.png";
	// Crea l'area di lavoro per la mask
	$mask_img = imagecreatefrompng($mask_name);
	// Controlla il formato dell'immagine di cui fare il thumbnail e 
crea di conseguenza l'area di lavoro
	// Recupera le informazioni sul tipo di immagine
	$imageinfo = getimagesize($background_name);
 
	// Carica l'immagine JPEG su cui applicare la mask. L'immagine 
caricata era stata convertita in JPEG
	// dalla funzione upload_image().
		switch($imageinfo[2]) {
			case 1: // File GIF
				$background_img = imagecreatefromgif
($background_name);
			break;
			case 2: // File JPEG
				$background_img = imagecreatefromjpeg
($background_name);
			break;
			case 3: // File PNG
				$background_img = imagecreatefrompng
($background_name);
			break;
			default:
				die("I file supportati per la creazione di un 
Thumbnail sono GIF, JPEG e PNG");
			break;
		}
 
	// Recupera le dimensioni della mask
	$imagesize = getimagesize($mask_name);
	$mask_width = $imagesize[0];
	$mask_height = $imagesize[1];
 
	// Recupera le dimensioni dell'immagine
	$imagesize = getimagesize($background_name);
	$background_width = $imagesize[0];
	$background_height = $imagesize[1];
 
	// Calcola i rapporti delle due immagini (larghezza/altezza)
	$mask_rapporto = $mask_width / $mask_height;
	$background_rapporto = $background_width / $background_height;
 
	// Controlla se deve lavorare sull'altezza o sulla larghezza e 
calcola le nuove dimensioni
	if($background_rapporto > $mask_rapporto) { // Lavora sull'altezza
		$thumbnail_height = $mask_height;
		$thumbnail_width = $mask_height * $background_rapporto;
		$thumbnail_wshifting =  0 - (($thumbnail_width - 
$mask_width) / 2);
		$thumbnail_hshifting =  0 - (($thumbnail_height - 
$mask_height) / 2);
	} else { // Lavora sulla larghezza
		$thumbnail_width = $mask_width;
		$thumbnail_height = $mask_width * (1 / 
$background_rapporto);
		$thumbnail_wshifting =  0 - (($thumbnail_width - 
$mask_width) / 2);
		$thumbnail_hshifting =  0 - (($thumbnail_height - 
$mask_height) / 2);
	}
 
	// Crea l'area di lavoro in cui effettuare la sovrapposizione
	$thumbnail_img = imagecreatetruecolor($mask_width,$mask_height);
 
	// Copia l'immagine di sfondo nell'area di lavoro del thumbnail 
ridimensionandola e centrandola
	imagecopyresized($thumbnail_img,$background_img,
$thumbnail_wshifting,$thumbnail_hshifting,0,0,$thumbnail_width,
$thumbnail_height,$background_width,$background_height);
 
	// Imposta il file per riconoscere il canale alpha di sfumatura 
dell'immagine da sovrapporre
	imagealphablending($thumbnail_img, true);
 
	// Sovrappone all'immagine ridimensionata la mask
	imagecopy($thumbnail_img,$mask_img,0,0,0,0,$mask_width,
$mask_height);
 
	// Salva il thumbnail dell'immagine
	imagejpeg($thumbnail_img,$thumbnail_name,100);
 
	// Libera memoria cancellando le aree di lavoro temporanee in cui 
ha lavorato
	imagedestroy($mask_img);
	imagedestroy($background_img);
	imagedestroy($thumbnail_img);
}
?>
Ciao a tutti!
