Lage Thumbnails av bilder som lastes opp?

Mr Vest

Sjefen over alle sjefer!
Jeg aner virkelig ikke helt hvordan dette her funker, men hvordan lager man Thunbnails av bilder som blir lastet opp? Er dette noe jeg i det hele tatt kan gjøre med PHP?

Scriptet jeg bruker i dag laster opp filer til server, gir dem ett nytt navn, men lager ikke noen som helst thumbs av dem. Det sluker jo mildt sagt enormt med båndbredde og vise gjerne 30 bilder a 500KB på en og samme sidevisning. Jeg husker virkelig ikke hvor jeg fant dette scriptet, men kunne noen av dere være kul med meg og fortelle hva jeg må gjøre for og også lage thumbnails av bildene dette scriptet laster opp? :)

PHP:
<?
//define a maxim size for the uploaded images in Kb
 define ("MAX_SIZE","10000"); 

//This function reads the extension of the file. It is used to determine if the file  is an image by checking the extension.
 function getExtension($str) {
         $i = strrpos($str,".");
         if (!$i) { return ""; }
         $l = strlen($str) - $i;
         $ext = substr($str,$i+1,$l);
         return $ext;
 }

//This variable is used as a flag. The value is initialized with 0 (meaning no error  found)  
//and it will be changed to 1 if an errro occures.  
//If the error occures the file will not be uploaded.
 $errors=0;
//checks if the form has been submitted
 if(isset($_POST['Submit'])) 
 {
 	//reads the name of the file the user submitted for uploading
 	$image=$_FILES['image']['name'];
 	//if it is not empty
 	if ($image) 
 	{
 	//get the original name of the file from the clients machine
 		$filename = stripslashes($_FILES['image']['name']);
 	//get the extension of the file in a lower case format
  		$extension = getExtension($filename);
 		$extension = strtolower($extension);
 	//if it is not a known extension, we will suppose it is an error and will not  upload the file,  
	//otherwise we will do more tests
 if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
 		{
		//print error message
 			echo '<h1>Unknown extension!</h1>';
 			$errors=1;
 		}
 		else
 		{
//get the size of the image in bytes
 //$_FILES['image']['tmp_name'] is the temporary filename of the file
 //in which the uploaded file was stored on the server
 $size=filesize($_FILES['image']['tmp_name']);

//compare the size with the maxim size we defined and print error if bigger
if ($size > MAX_SIZE*1024)
{
	echo '<h1>You have exceeded the size limit!</h1>';
	$errors=1;
}

//we will give an unique name, for example the time in unix time format
$image_name=time().'.'.$extension;
//the new name will be containing the full path where will be stored (images folder)
$newname="images/".$image_name;
//we verify if the image has been uploaded, and print error instead
$copied = copy($_FILES['image']['tmp_name'], $newname);
if (!$copied) 
{
	echo '<h1>Copy unsuccessfull!</h1>';
	$errors=1;
}}}}

//If no errors registred, print the success message
 if(isset($_POST['Submit']) && !$errors) 
{
echo "
Bildet er slengt opp. Dritkult!
<br><br>
<img src=\"hxxp://domene.com/$newname\" width=\"250\">
<br><br>
<h1 class=\"stortittel\">Laste opp enda ett bilde?</h1>
";
 }
?>

Tar gjerne også imot tips til andre småscript som kan gjøre jobben. :) Takk.!
 

hansvh

Medlem
JPEG har innebygd støtte for integrerte thumbnails. Er det aktuelt for deg å huke av i GIMP/Photoshop for at du vil legge ved thumbnail eller brukes uploaden også av brukere og slikt?

Script som henter ut thumbs fra den store varianten er på et par linjer hvis det er aktuelt. Når jeg tenker meg om så er det vel egentlig ganske enkelt å nedskalere det store bildet og lagre thumb til fil også. Dette har jeg dog ikke klart liggende.

http://us3.php.net/manual/en/function.imagecopyresampled.php er en aktuell funksjon for nedskalering.
 

Mr Vest

Sjefen over alle sjefer!
Jeg er nok redd for at også brukere / andre enn meg selv laster opp bilder. Dessuten blir også GIF og PNG lastet opp med scriptet. Derfor er nok løsning med og legge ved en slik thumbnail ikke så nyttig. :(

Vil det og vise thumbnail fra orginalbildene sørge for at ikke orginalbildet blir lastet ned av de som kun skal se en thumb? (Tenker på det scriptet du nevner med ett par linjer.)

Når jeg leser på linken finner jeg ett ukjent ord. Hva betyr "resample" ? F.eks "This example will resample an image to half its original size." ?
 

tyr897

Medlem
Resample betyr i denne sammenheng ganske enkelt å forandre dimensjonene på bildet, som er akkurat hva du ønsker å gjennomføre.

"resample an image to half its original size" betyr dermed rett og slett å gjøre bildet halvparten så stort (i piksler)
 

Mr Vest

Sjefen over alle sjefer!
Neida, jeg vil ikke forande dimensjonene på bildene. Jeg vil bare lage en kopi av bildet når det lastes opp og denne kopien skal da altså være en liten thumbnail.
 
U

Uregistrert

Guest
Og da forandrer du dimensjonene, og lagrer bildet et annet sted.
Når du åpner bildet og resampler, er resultatet bare en ressurs, du har ikke endret originalen - du kan selve velge hvor og i hvilket format du ønsker å lagre bildet.
 

Mr Vest

Sjefen over alle sjefer!
Jammen Uregistrert, jeg trenger da ikke få fortalt en gang til hva jeg ønsker og utrette. Det er hvordan jeg kan gjøre det jeg undrer meg på.
 

tyr897

Medlem
Forrige post var min, brukte visst et annet browservindu som ikke var logget inn.

Altså, du fikk forklart ordet du ønsket en forklaring på, men misforstod konteksten - jeg gav deg da en litt mer utfyllende forklaring.

Eksempelet i manualen (imagecopyresampled) viser nøyaktig hva du ønsker å utrette, med unntak av at du må gi et filnavn til imagejpeg og droppe headeren.
Jeg kan selvsagt skrive kodesnutten til deg, men av dine andre tråder har jeg fått inntrykk av at du ønsker å utvikle deg som koder, og dersom det er tilfelle, vil det være å gjøre deg en bjørnetjeneste. Beklager dog om jeg var litt for diffus i min uttrykksmåte.
 

Mr Vest

Sjefen over alle sjefer!
Jeg var nok litt krass i svaret mitt også, beklager det. Har sittet her og revet hodet av meg på noe Wordpress-skit litt for lenge. Er i en fase hvor jeg snart kategoriserer Wordpress som et hat-objekt. Men nok om det... :)

Altså, gi et filnavn til imagejpeg? Hvordan kan jeg gjøre det? Jeg forstår ikke eksempelet så veldig bra faktisk... Egentlig tror jeg det er 2 ting jeg ikke forstår med hele eksempelet nå, og det er altså:

1:
Når jeg kikker øverst i eksempelet så finner jeg $filename. Kan denne inneholde sti til bildet dersom bildet finnes i en annen mappe? f.eks /images/storebilder/123.jpg? Eller kan den kun inneholde filnavnet? Hva kan jeg evt gjøre dersom filen befinner seg ett annet sted?

2:
Hva mener du med og gi filnavn til imagejpeg? Er det noe med imagejpeg($image_p, null, 100); jeg må gjøre der?

Utvikle meg som koder ja. En skummel tanke akkurat nå, men det skal jo bli spennende og se hva for noen snodige kunnskaper jeg sitter på om noen hundre år. :)
 

Nextri

Rebel
1. $filename kan være sti til bildet, eller bare filnavnet, hvis filen ligger i samme mappe som scriptet.
2. der det står null må du skrive hvor du vil at bildet skal lagres.

her er en funksjon jeg pleier å bruke.

PHP:
	function userCrop($srcThumb,$destThumb,$co=array(),$ext='',$delOrg=FALSE) {
		if(empty($co)){
			return FALSE;
		}
		if(strtolower($ext)=='.jpg'){
			$newimage = imagecreatefromjpeg($srcThumb);
		}elseif(strtolower($ext)=='.gif'){
			$newimage = imagecreatefromgif($srcThumb);
		}elseif(strtolower($ext)=='.png'){
			$newimage = imagecreatefrompng($srcThumb);
		}
		if(!$newimage){
			return FALSE;
		}
		$newthumb = imagecreatetruecolor($co['dest_width'],$co['dest_height']);
		imagecopyresampled($newthumb,$newimage,0,0,$co['x1'],$co['y1'],$co['dest_width'],$co['dest_height'],$co['width'],$co['height']);
		if(strtolower($ext)=='.jpg'){
			imagejpeg($newthumb,$destThumb,90); 
		}elseif(strtolower($ext)=='.gif'){
			imagegif($newthumb,$destThumb,90); 
		}elseif(strtolower($ext)=='.png'){
			imagepng($newthumb,$destThumb,90); 
		}
		if($delOrg){
			@unlink($srcThumb);
		}
		imagedestroy($newimage);
		imagedestroy($newthumb);
		return TRUE;	
	}
 

Pong

Jeg selger sʇɥƃıluʍop :)
Såvidt jeg så resizer ikke kodesnutten din bildet, bare laster den opp.
Hvis du etterpå kjører denne:

function resizeImage( $source, $target, $width, $height ) {
// Get new dimensions
$finfo = @getimagesize( $source );
if( $finfo[0] != "" ) {
$width_orig = $finfo[0];
$height_orig = $finfo[1];
$ratio_orig = $width_orig / $height_orig;
if( $width/$height > $ratio_orig ) {
$width = $height*$ratio_orig;
} else {
$height = $width/$ratio_orig;
}
if( $width > $width_orig && $height > $height_orig ) {
$width = $width_orig;
$height = $height_orig;
}

// File-type
$types = array( 'gif','jpg','png','swf','psd','bmp','tiff(intel)','tiff(motorola)','jpc','jp2','jpx','jb2','swc','iff','wbmp','xbm');

// Read the file
$unknown = false;
$image_p = imagecreatetruecolor( $width, $height );
switch( $finfo[2] ) {
case 1: $image = imagecreatefromgif( $source ); break;
case 2: $image = imagecreatefromjpeg( $source ); break;
case 3: $image = imagecreatefrompng( $source ); break;
case 15: $image = imagecreatefromwbmp( $source ); break;
case 16: $image = imagecreatefromxbm( $source ); break;
default: $unknown = true;
}

if( $unknown ) {
// Just make a copy if $source <> $target
if( $source != $target ) {

}
} else {
// Resample
imagecopyresampled( $image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig );

// Save the image
imagejpeg( $image_p, $target, 95 );
imagedestroy( $image_p );
}
}
}

Heilt heimalaga ein gång.
 

Mr Vest

Sjefen over alle sjefer!
Jeg har ikke kikket på koden enda, men finner nok helt sikkert ut av det etter de gode svar jeg fikk. Takk. :)
 

Mr Vest

Sjefen over alle sjefer!
Sjå der ja. Flotte greier. Det tok litt tid før jeg fant ut at jeg måtte skrive hele stien inkludert nytt filnavn helt nederst i imagejpeg, men straks jeg fant ut det funker dette som en drøm.!

Tusen hjertelig takk for alle svar. Om noen har interesse av et forholdsvis enkelt lite script som laster opp bilder og lager thumbnails av dem samtidig får dere bare si ifra. Da kan jeg heller legge det opp her.
 

Mr Vest

Sjefen over alle sjefer!
nextri:

Jeg sitter her og kikker litt på koden din der oppe og finner følgende:

if(strtolower($ext)=='.jpg'){
$newimage = imagecreatefromjpeg($srcThumb);
}elseif(strtolower($ext)=='.gif'){
$newimage = imagecreatefromgif($srcThumb);
}elseif(strtolower($ext)=='.png'){
$newimage = imagecreatefrompng($srcThumb);
}

Men hvordan kan denne koden vite hvilken fil den faktisk skal sjekke formatet på?

Jeg fikk jo dette her til og fungere slik som dette jeg:

PHP:
// Litt nyttig informasjon er bra for helsen
$newlocation="images/album/thumbs/".$image_name;
$filename = $newname;

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = 250;
$new_height = 150;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, $newlocation, 100);

Men denne har jo da altså kun støtte for JPEG. Hva kan jeg gjøre for og sjekke filformatet, og deretter servere riktig kode for de forkjellige? Jeg ser for meg noe slikt som dette:

PHP:
// Litt nyttig informasjon er bra for helsen
$newlocation="images/album/thumbs/".$image_name;
$filename = $newname;

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = 250;
$new_height = 150;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
if (Filformat er PNG)
{
$image = imagecreatefrompng($filename);
}
else if (Filformat er GIF)
{
$image = imagecreatefromgif($filename);
}
else
{
$image = imagecreatefromjpeg($filename);
}
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, $newlocation, 100);

Men jeg er da altså veldig usikker på hva jeg må skrive i de forkjellige "iffene" for og sjekke hva for et format filene er i. Noen som vet? Er jeg helt på jordet her?
 
Sist redigert:
Topp