Hello, I have found a decent auto generating thumbnail script on the net and I’ve had it stored for a long time without really paying any attention to it. So the other day I ran it out of curiosity to see if it worked. It did and does a good job however it produces very poor quality thumbnail photos.
Does anyone have any idea why this is and how to fix it? I have been looking into the functions from the manual on the main PHP website but am lost as to why I can’t get the quality to improve. The line I have zeroed in on was line 79 where it states:
imagejpeg($dst_img, $filename, 100);
Since imagejpeg is the only function that takes quality into consideration, I added 100 here. I know by default, and without a number, it uses 75 as a quality. However, in this script, changing this number does nothing for me and the thumbnails are still terrible. Any insight is appreciated.
I am running the 2.0.34 compatible version of the GD library from the PHP 5.3.0 install in a WAMP environment.
Thank you!
Have two folders created and named pics and [B]thumbs
pics[/B] is where the fullsize photos reside. Leave thumbs blank as the script will populate it on runtime.
<?php
$gd2=checkgd();
$pics=directory("pics","jpg,JPG,JPEG,jpeg,png,PNG");
$pics=ditchtn($pics,"tn_");
if ($pics[0]!=""){
foreach ($pics as $p){
createthumb("pics/".$p,"thumbs/tn_".$p,100,100);
}
}
/*
Function checkgd()
checks the version of gd, and returns "yes" when it's higher than 2
*/
function checkgd(){
$gd2="";
ob_start();
phpinfo(8);
$phpinfo=ob_get_contents();
ob_end_clean();
$phpinfo=strip_tags($phpinfo);
$phpinfo=stristr($phpinfo,"gd version");
$phpinfo=stristr($phpinfo,"version");
$end=strpos($phpinfo," ");
$phpinfo=substr($phpinfo,0,$end);
$phpinfo=substr($phpinfo,7);
if (preg_match("/2./",$phpinfo)){$gd2="yes";}
return $gd2;
}
/*
Function ditchtn($arr,$thumbname)
filters out thumbnails
*/
function ditchtn($arr,$thumbname){
foreach ($arr as $item){
if (!preg_match("/^".$thumbname."/",$item)){$tmparr[]=$item;}
}
return $tmparr;
}
/*
Function createthumb($name,$filename,$new_w,$new_h)
creates a resized image
variables:
$name Original filename
$filename Filename of the resized image
$new_w width of resized image
$new_h height of resized image
*/
function createthumb($name,$filename,$new_w,$new_h){
global $gd2;
$system=explode(".",$name);
if (preg_match("/jpg|jpeg/",$system[1])){$src_img=imagecreatefromjpeg($name);}
if (preg_match("/png/",$system[1])){$src_img=imagecreatefrompng($name);}
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
if ($old_x > $old_y) {
$thumb_w=$new_w;
$thumb_h=$old_y*($new_h/$old_x);
}
if ($old_x < $old_y) {
$thumb_w=$old_x*($new_w/$old_y);
$thumb_h=$new_h;
}
if ($old_x == $old_y) {
$thumb_w=$new_w;
$thumb_h=$new_h;
}
if ($gd2==""){
$dst_img=ImageCreate($thumb_w,$thumb_h);
imagecopyresized($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
}else{
$dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
}
if (preg_match("/png/",$system[1])){
imagepng($dst_img, $filename);
} else {
imagejpeg($dst_img, $filename, 100);
}
imagedestroy($dst_img);
imagedestroy($src_img);
}
/*
Function directory($directory,$filters)
reads the content of $directory, takes the files that apply to $filter
and returns an array of the filenames.
You can specify which files to read, for example
$files = directory(".","jpg,gif");
gets all jpg and gif files in this directory.
$files = directory(".","all");
gets all files.
*/
function directory($dir,$filters){
$handle=opendir($dir);
$files=array();
if ($filters == "all"){while(($file = readdir($handle))!==false){$files[] = $file;}}
if ($filters != "all"){
$filters=explode(",",$filters);
while (($file = readdir($handle))!==false) {
for ($f=0;$f<sizeof($filters);$f++):
$system=explode(".",$file);
if ($system[1] == $filters[$f]){$files[] = $file;}
endfor;
}
}
closedir($handle);
return $files;
}
?>