|
 |
imagecopyresampled (PHP 4 >= 4.0.6, PHP 5) imagecopyresampled -- Copy and resize part of an image with resampling Descriptionbool imagecopyresampled ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )
imagecopyresampled() copies a rectangular
portion of one image to another image, smoothly interpolating pixel
values so that, in particular, reducing the size of an image still
retains a great deal of clarity.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
dst_image is the destination image,
src_image is the source image identifier. If
the source and destination coordinates and width and heights
differ, appropriate stretching or shrinking of the image fragment
will be performed. The coordinates refer to the upper left
corner. This function can be used to copy regions within the
same image (if dst_image is the same as
src_image) but if the regions overlap the
results will be unpredictable.
Замечание:
There is a problem due to palette image limitations (255+1 colors).
Resampling or filtering an image commonly needs more colors than 255, a
kind of approximation is used to calculate the new resampled pixel and its
color. With a palette image we try to allocate a new color, if that
failed, we choose the closest (in theory) computed color. This is
not always the closest visual color. That may produce a weird result, like
blank (or visually blank) images. To skip this problem, please use a
truecolor image as a destination image, such as one created by
imagecreatetruecolor().
Замечание: Эта функция нуждается в GD версии 2.0.1 или выше.
Примеры
Пример 1. Simple example
This example will resample an image to half its original size.
<?php
$filename = 'test.jpg';
$percent = 0.5;
header('Content-type: image/jpeg');
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagejpeg($image_p, null, 100);
?>
|
|
Пример 2. Resampling an image proportionally
This example will display an image with the maximum width,
or height, of 200 pixels.
<?php
$filename = 'test.jpg';
$width = 200;
$height = 200;
header('Content-type: image/jpeg');
list($width_orig, $height_orig) = getimagesize($filename);
if ($width && ($width_orig < $height_orig)) {
$width = ($height / $height_orig) * $width_orig;
} else {
$height = ($width / $width_orig) * $height_orig;
}
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagejpeg($image_p, null, 100);
?>
|
|
imagecopyresampled
caio at daisuki dot com dot br
14-Jul-2006 02:51
Ok guys, the ultimate image merging tool, enjoy:
function watermark($sourcefile, $watermarkfiles, $destination, $quality=90) {
/*
$sourcefile = Filename of the picture to be watermarked.
$watermarkfile = files to add. Each is: array ( 'filename' => filename , 'position' => position to show(array), 'resample' => new dimension(array) )
You can omit any except filename
$destination = jpg or png file to output (jpg if source is jpg, png if source is png). Send blank to direct output
Sample:
$batch = array ( array ( 'filename' => "watermark.png",
'position' => array(100,0),
),
array ( 'filename' => "brilho.png",
'position' => array(200,200),
'resample' => array(30,30)
)
);
watermark("picture.jpg", $batch, "", 90); <-- will add both images in bath on top of picture, preserving transparency
*/
$ih = getimagesize($sourcefile);
$ispng = $ih[2] == 3;
if ($ispng)
$sourcefile_id = imagecreatefrompng($sourcefile);
else
$sourcefile_id = imagecreatefromjpeg($sourcefile);
$sourcefile_width=imageSX($sourcefile_id);
$sourcefile_height=imageSY($sourcefile_id);
foreach ($watermarkfiles as $x => $watermarkfile) {
$watermarkfile_id = imagecreatefrompng($watermarkfile['filename']);
imageAlphaBlending($watermarkfile_id, false);
imageSaveAlpha($watermarkfile_id, true);
$watermarkfile_width=imageSX($watermarkfile_id);
$watermarkfile_height=imageSY($watermarkfile_id);
// resample?
if (isset($watermarkfile['resample'])) {
$im_dest = imagecreatetruecolor ($watermarkfile['resample'][0], $watermarkfile['resample'][1]);
imagealphablending($im_dest, false);
imagecopyresampled($im_dest, $watermarkfile_id, 0, 0, 0, 0, $watermarkfile['resample'][0], $watermarkfile['resample'][1], $watermarkfile_width, $watermarkfile_height);
imagesavealpha($im_dest, true);
imagedestroy($watermarkfile_id);
$watermarkfile_id = $im_dest;
$watermarkfile_width = $watermarkfile['resample'][0];
$watermarkfile_height = $watermarkfile['resample'][1];
}
// position ? if none given, centered
if (isset($watermarkfile['position']))
list($dest_x,$dest_y) = $watermarkfile['position'];
else {
$dest_x = ( $sourcefile_width / 2 ) - ( $watermarkfile_width / 2 ); // centered
$dest_y = ( $sourcefile_height / 2 ) - ( $watermarkfile_height / 2 ); // centered
}
imagecopy($sourcefile_id, $watermarkfile_id, $dest_x, $dest_y, 0, 0, $watermarkfile_width, $watermarkfile_height);
imagedestroy($watermarkfile_id);
}
if ($ispng)
imagepng($sourcefile_id,$destination);
else
imagejpeg($sourcefile_id,$destination,$quality);
imagedestroy($sourcefile_id);
}
spencejames2000 at yahoo dot co dot uk
13-May-2006 06:27
For anyone suffering from the srcX and srcY bug (some versions of gd ignore them completely - see http://bugs.php.net/bug.php?id=12780 for details), a quick solution is to use this code snippet:
<?php
function imgcopyresampled(&$dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
{
$tmp_img = imagecreatetruecolor($src_w, $src_h);
$rv2 = imagecopy($tmp_img, $src_img, 0,0, $src_x, $src_y, $src_w, $src_h);
$rv1 = imagecopyresampled($dst_img, $tmp_img, $dst_x,$dst_y, 0,0, $dst_w, $dst_h, $src_w, $src_h);
imagedestroy($tmp_img);
return($rv1 and $rv2);
}
?>
By using imagecopy to extract the relevant portion of the source image, it works a lot more quickly than pike's solution below, and also without the extra blur.
It may be useful to use override_function in existing projects, although I have not tested this myself.
Tyron Madlener (tyron.at)
11-May-2006 01:43
Creating a thumbnail (120x90 pixel) of a big image (3000x2000 pixel) took me about 5 seconds with imagecopyresampled()
Thats pretty much, so I tested a little how I could improve the speed. I found that imagecopyresized is way faster but results in poor quality.
So I combined both - I first reduce the big image via imagecopyresized to 1024x768 pixel and then create the small thumbnail via imagecopyresampled. The resulting quality is almost the same. In my tests, resizing took only about 2.2 seconds now - twice as fast :)
I also tried using that bicubic image resizing function in some earlier post here, but it was only faster when the thumbnails were smaller than 120x90 and the quality was not very good.
Here's the code if you wanna (I guess there are still a few possibilites to do some more optimiztions tough):
<?php
function CreateThumb($file,$maxwdt,$maxhgt, $dest) {
list($owdt,$ohgt,$otype)=@getimagesize($file);
switch($otype) {
case 1: $newimg=imagecreatefromgif($file); break;
case 2: $newimg=imagecreatefromjpeg($file); break;
case 3: $newimg=imagecreatefrompng($file); break;
default: echo "Unkown filetype (file $file, typ $otype)"; return;
}
if($newimg) {
if($owdt>1500 || $ohgt>1200)
list($owdt, $ohgt) = Resample($newimg, $owdt, $ohgt, 1024,768,0);
Resample($newimg, $owdt, $ohgt, $maxwdt, $maxhgt);
if(!$dest) return $newimg;
if(!is_dir(dirname($dest)))
mkdir(dirname($dest));
switch($otype) {
case 1: imagegif($newimg,dest); break;
case 2: imagejpeg($newimg,$dest,90); break;
case 3: imagepng($newimg,$dest); break;
}
imagedestroy($newimg);
chmod($dest,0644);
}
}
function Resample(&$img, $owdt, $ohgt, $maxwdt, $maxhgt, $quality=1) {
if(!$maxwdt) $divwdt=0;
else $divwdt=Max(1,$owdt/$maxwdt);
if(!$maxhgt) $divhgt=0;
else $divhgt=Max(1,$ohgt/$maxhgt);
if($divwdt>=$divhgt) {
$newwdt=$maxwdt;
$newhgt=round($ohgt/$divwdt);
} else {
$newhgt=$maxhgt;
$newwdt=round($owdt/$divhgt);
}
$tn=imagecreatetruecolor($newwdt,$newhgt);
if($quality)
imagecopyresampled($tn,$img,0,0,0,0,$newwdt,$newhgt,$owdt,$ohgt);
else
imagecopyresized($tn,$img,0,0,0,0,$newwdt,$newhgt,$owdt,$ohgt);
imagedestroy($img);
$img = $tn;
return array($newwdt, $newhgt);
}
?>
mracek at xko dot cz
09-Mar-2006 12:01
Here is function which:
- resize and crop (crop format 4:3 or 1:1)
- methode resample/resize
- open jpg, gif, bmp, png
- save jpg (85%), gif, bmp, png
- show images
$FILE_MIMES = array(
'image/pjpeg'=>"jpg",
'image/jpeg'=>"jpg",
'image/jpg'=>"jpg",
'image/png'=>"png",
'image/x-png'=>"png",
'image/gif'=>"gif",
'image/bmp'=>"bmp");
$FILE_EXTS = array('.jpeg','.jpg','.png','.gif','.bmp');
$MAX_SIZE = 16777216;
$lng=array(
's_imgDimension'=>array(
"80",
"320"
),
's_imgCrop' =>array(
"- auto -",
"na sirku",
"na vysku",
"ctverec",
"- zadne -"
),
's_imgFormat' =>array(
"4/3",
"1/1"
),
's_imgType' =>array(
"jpg",
"png",
"gif",
"bmp"
),
's_imgMethode' =>array(
"resample",
"resize"
)
);
function PPimageTransform($photo1,$type1,$dim,$crop,
$format,$methode,$photo2,$type2)
{
if ($photo1!=="" && File_Exists($photo1))
{
if (!($crop>0 && $crop<5)) $crop=0;
width=x"
list($w,$h) = GetImageSize($photo1);
$w=($w<1)?1:$w;
$h=($h<1)?1:$h;
$wh=$w/$h;
// format
$format=($format=='4/3')?4/3:1;
// auto crop
if ($crop==0)
{
$z1=$format- ($format-1)/2;
$z2=$format+(1-$format-1)/2;
if ($wh>$z1) {$crop=1;}
elseif ($wh<$z2) {$crop=2;}
else {$crop=3;}
}
// scale
if ($crop==4)
{
$a=$w>$h?$w:$h;
$scale=$dim/$a;
$nw=$w*$scale;$nw=($nw<1)?1:$nw;
$nh=$h*$scale;$nh=($nh<1)?1:$nh;
$d=array(0,0,floor($nw),floor($nh));
$s=array(0,0,$w,$h);
}
else
{
if ($crop==3) {$nw=1;$nh=1;}
elseif ($crop==2) {$nw=1/$format;$nh=1;}
elseif ($crop==1) {$nw=1;$nh=1/$format;}
$nw*=$dim;$nw=($nw<1)?1:$nw;
$nh*=$dim;$nh=($nh<1)?1:$nh;
$s1=$nw/$w;
$s2=$nh/$h;
$h1=$nh*$s1;
$w2=$nw*$s2;
$s1=($h1<=$nh)?$s1:0;
$s2=($w2<=$nw)?$s2:0;
$scale=($s1>$s2)?$s1:$s2;
$scale=($scale<=0)?1:$scale;
$d=array(0,0,floor($nw),floor($nh));
$x1=floor(($w-$d[2]/$scale)/2);$x1=$x1<0?0:$x1;
$y1=floor(($h-$d[3]/$scale)/2);$y1=$y1<0?0:$y1;
$s=array($x1,$y1,floor($w-2*$x1),floor($h-2*$y1));
}
// input/output
switch($type1)
{
case 'jpg': $imgIn = ImageCreateFromJPEG; break;
case 'png': $imgIn = ImageCreateFromPNG; break;
case 'gif': $imgIn = ImageCreateFromGIF; break;
case 'bmp': $imgIn = ImageCreateFromWBMP; break;
default: return FALSE; break;
}
switch($type2)
{
case 'jpg': $imgOut = ImageJPEG; break;
case 'png': $imgOut = ImagePNG; break;
case 'gif': $imgOut = ImageGIF; break;
case 'bmp': $imgOut = ImageWBMP; break;
default: return FALSE; break;
}
// resample (d-destination, s-source)
$image1 = $imgIn($photo1);
if ($methode==0)
{
$image2 = ImageCreateTruecolor($d[2],$d[3]);
ImageCopyResampled($image2, $image1,
$d[0],$d[1], $s[0],$s[1], $d[2],$d[3], $s[2],$s[3]);
}
else {
$image2 = ImageCreate($d[2],$d[3]);
ImageCopyResized($image2, $image1,
$d[0],$d[1], $s[0],$s[1], $d[2],$d[3], $s[2],$s[3]);
}
// output
if ($type2=='jpg')
{$imgOut($image2,$photo2,85);}
else {$imgOut($image2,$photo2);}
ImageDestroy($image2);
ImageDestroy($image1);
}
}
dmitry at dest dot by
07-Mar-2006 06:03
Simple script on change of width and automatic creation of height, and also creation of the signature in the right we string to a corner. (Only for Jpg)
function easyResize($img_sourse, $save_to, $quality, $width, $str) {
$size = GetImageSize($img_sourse);
$im_in = ImageCreateFromJPEG($img_sourse);
$new_height = ($width * $size[1]) / $size[0]; // Generate new height for image
$im_out = imagecreatetruecolor($width, $new_height);
ImageCopyResampled($im_out, $im_in, 0, 0, 0, 0, $width, $new_height, $size[0], $size[1]);
#Find X & Y for note
$X_var = ImageSX($im_out);
$X_var = $X_var - 130;
$Y_var = ImageSY($im_out);
$Y_var = $Y_var - 25;
#Color
$white = ImageColorAllocate($im_out, 0, 0, 0);
#Add note(simple: site address)
ImageString($im_out,2,$X_var,$Y_var,$str,$white);
ImageJPEG($im_out, $save_to, $quality); // Create image
ImageDestroy($im_in);
ImageDestroy($im_out);
}
// $str - Inscription on the image;
areddan at silverarm dot ie
29-Jan-2006 06:30
$file =$_FILES[userfile];
//name of the input form file upload element is userfile
//$to_file is a full path including filename
//to where you want the thumnail to be copied to .
//example /usr/www/users/www/images/thumbs/thumb1.jpg
copy($file[tmp_name],$to_file) or die("The file $file[tmp_name] you are trying to upload couldn't be copied to $to_file");
//Extra stuff to put into the output to allow for jpeg / png or gif
//replace line: imagegif($thumb2, $fileout); //write to file with the following
switch($format)
{
case 'image/jpeg':
imagejpeg($thumb2, $fileout,90); //write to file
break;
case 'image/gif';
imagegif($thumb2, $fileout); //write to file
break;
case 'image/png':
imagepng($thumb2, $fileout); //write to file
break;
}
areddan at silverarm dot ie
27-Jan-2006 12:40
<?php
$filein = ''; $fileout = 'ttt.gif'; $imagethumbsize_w = 100; $imagethumbsize_h = 75; resize_then_crop( $filein,$fileout,$imagethumbsize_w,
$imagethumbsize_h,"255","255","255");
function resize_then_crop( $filein,$fileout,
$imagethumbsize_w,$imagethumbsize_h,$red,$green,$blue)
{
list($width, $height) = getimagesize($filein);
$new_width = $width * $percent;
$new_height = $height * $percent;
if(preg_match("/.jpg/i", "$filein"))
{
$format = 'image/jpeg';
}
if (preg_match("/.gif/i", "$filein"))
{
$format = 'image/gif';
}
if(preg_match("/.png/i", "$filein"))
{
$format = 'image/png';
}
switch($format)
{
case 'image/jpeg':
$image = imagecreatefromjpeg($filein);
break;
case 'image/gif';
$image = imagecreatefromgif($filein);
break;
case 'image/png':
$image = imagecreatefrompng($filein);
break;
}
$width = $imagethumbsize_w ;
$height = $imagethumbsize_h ;
list($width_orig, $height_orig) = getimagesize($filein);
if ($width_orig < $height_orig) {
$height = ($imagethumbsize_w / $width_orig) * $height_orig;
} else {
$width = ($imagethumbsize_h / $height_orig) * $width_orig;
}
if ($width < $imagethumbsize_w)
{
$width = $imagethumbsize_w;
$height = ($imagethumbsize_w/ $width_orig) * $height_orig;;
}
if ($height < $imagethumbsize_h)
{
$height = $imagethumbsize_h;
$width = ($imagethumbsize_h / $height_orig) * $width_orig;
}
$thumb = imagecreatetruecolor($width , $height);
$bgcolor = imagecolorallocate($thumb, $red, $green, $blue);
ImageFilledRectangle($thumb, 0, 0, $width, $height, $bgcolor);
imagealphablending($thumb, true);
imagecopyresampled($thumb, $image, 0, 0, 0, 0,
$width, $height, $width_orig, $height_orig);
$thumb2 = imagecreatetruecolor($imagethumbsize_w , $imagethumbsize_h);
$bgcolor = imagecolorallocate($thumb2, $red, $green, $blue);
ImageFilledRectangle($thumb2, 0, 0,
$imagethumbsize_w , $imagethumbsize_h , $white);
imagealphablending($thumb2, true);
$w1 =($width/2) - ($imagethumbsize_w/2);
$h1 = ($height/2) - ($imagethumbsize_h/2);
imagecopyresampled($thumb2, $thumb, 0,0, $w1, $h1,
$imagethumbsize_w , $imagethumbsize_h ,$imagethumbsize_w, $imagethumbsize_h);
if ($fileout !="")imagegif($thumb2, $fileout); header('Content-type: image/gif');
imagegif($thumb2); }
?>
com.hotmail@backglancer
07-Jan-2006 10:32
wrote this for a game I was helping develop:
Auto Tile Maker -- takes the image and cuts it in several smaller pieces, deleting the original... i mean.. this is just for those of you who are lazy, coz the script is simple..
modify at will.
<?
$size = getimagesize($newfile);
list($w, $h) = $size;
if ($h > 20 || $w > 20) {
$type = array_pop($size);
switch ($type) {
case 'image/jpeg' : $src_image = imagecreatefromjpeg($newfile); break;
default : echo 'not an image!'; return;
}
$i = 0;
for ($y = 0; $y < $h; $y += 20) {
for ($x = 0; $x < $w; $x += 20) {
$i++; $new_image = imagecreatetruecolor(20, 20);
imagecopyresampled ($new_image, $src_image,
0, 0,
$x, $y,
20, 20,
20, 20
);
imagegif($new_image, $floc.$i.$t['name']);
imagedestroy($new_image);
} } unlink($newfile);
}
?>
smrtak at 4um dot cz
06-Dec-2005 11:48
class cobrazek
{
function resizeMaxJpeg($file,$mx,$my,$q=85)
{
$dst = cobrazek::resizeMax(imagecreatefromjpeg($file),$mx,$my);
if(!$dst)
return false;
if(!imagejpeg($dst,$file,$q))
return false;
return true;
}
function resizeMax($src,$mx,$my)
{
//zjisti velikost
$sx = imagesx($src);
$sy = imagesy($src);
//spocitej cilovou velikost
$v = min(min($mx,$sx)/$sx,min($my,$sy)/$sy);
$dx = $v*$sx;
$dy = $v*$sy;
$dst = imagecreatetruecolor($dx,$dy);
//resample
imagecopyresampled ($dst,$src,0,0,0,0,$dx,$dy,$sx,$sy);
//vystup
return $dst;
}
}
pike-php at kw dot nl
14-Nov-2005 02:21
If you have a bug that imagecopyresampled is completely ignoring srcX and srcY (a known and closed bug - http://bugs.php.net/bug.php?id=12780) you can ofcourse apply two operations to do the same. E.g., instead of saying
ImageCopyResampled($dst_img, $src_img, 0, 0, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH);
you can say
ImageCopyResampled($tmp_img, $src_img, -$srcX, -$srcY, "BUG","BUG", $orgW, $orgH, $orgW, $orgH);
ImageCopyResampled($dst_img, $tmp_img, 0, 0, "BUG","BUG", $dstW, $dstH, $srcW, $srcH);
which has the same effect but is twice as slow and blurry. you may replace "BUG","BUG" with anything you like without sideeffects :)
$2c,
*pike
George_A
07-Nov-2005 02:49
For the best image quality...
How to get new proportional size of the image if the desible size of source image is approximatly equal to needed size. If needed size differs from source size on less than the user factor then transformation isn`t apply.
/**********************************************/
function imageCopyResize($image, $xSize, $ySize, $needed_user_factor, $new_image_path = "")
{
//example: neded_user_factor = 0.2
if($xSize == 0 || $ySize == 0)
return array("At the leat one pair of size is 0",0,0);
$size = getImageSize($image);
$width = $size[0];
$height = $size[1];
$x_ratio = $xSize / $size[0];
$y_ratio = $ySize / $size[1];
if($x_ratio > $y_ratio) $res_ratio = $y_ratio;
else $res_ratio = $x_ratio;
if(abs($res_ratio - 1) > $needed_user_factor)
{
$width = ceil($width * $res_ratio);
$height = ceil($height * $res_ratio);
}
$fileinfo = pathinfo($image);
$file_type = strtolower($fileinfo["extension"]);
if($file_type == "jpg" || $file_type == "jpeg")
$src = ImageCreateFromJpeg($image);
else if($file_type == "gif")
$src = ImageCreateFromGif($image);
else if($file_type == "png")
$src = ImageCreateFromPNG($image);
else if($file_type == "bmp")
$src = ImageCreateFromBmp($image); //Thanks Previous Coder
else
return array("Unknown image format: ".$file_type, 0, 0);
$output_path = ($new_image_path == "")?$image:$new_image_path;
$dst = ImageCreateTrueColor($width, $height);
ImageCopyResized($dst, $src, 0,0,0,0,$width, $height, $size[0], $size[1]);
if($file_type == "jpg" || $file_type == "jpeg")
ImageJpeg($dst, $output_path, 100);
else if($file_type == "gif" || $file_type == "bmp")
ImageGif($dst, $output_path);
else if($file_type == "png")
ImagePNG($dst, $output_path);
ImageDestroy($src);
ImageDestroy($dst);
return array("", $width, $height);
}
/**********************************************/
erik at phpcastle dot com
05-Nov-2005 02:21
I've changed the script from info at lontronics dot nl a little bit so the thumbnail is not cutted off when this is not necessary.
<?php
function resize($filename, $dest, $width, $height, $pictype = "")
{
$format = strtolower(substr(strrchr($filename,"."),1));
switch($format)
{
case 'gif' :
$type ="gif";
$img = imagecreatefromgif($filename);
break;
case 'png' :
$type ="png";
$img = imagecreatefrompng($filename);
break;
case 'jpg' :
$type ="jpg";
$img = imagecreatefromjpeg($filename);
break;
case 'jpeg' :
$type ="jpg";
$img = imagecreatefromjpeg($filename);
break;
default :
die ("ERROR; UNSUPPORTED IMAGE TYPE");
break;
}
list($org_width, $org_height) = getimagesize($filename);
$xoffset = 0;
$yoffset = 0;
if ($pictype == "thumb") {
if ($org_width / $width > $org_height/ $height)
{
$xtmp = $org_width;
$xratio = 1-((($org_width/$org_height)-($width/$height))/2);
$org_width = $org_width * $xratio;
$xoffset = ($xtmp - $org_width)/2;
}
elseif ($org_height/ $height > $org_width / $width)
{
$ytmp = $org_height;
$yratio = 1-((($width/$height)-($org_width/$org_height))/2);
$org_height = $org_height * $yratio;
$yoffset = ($ytmp - $org_height)/2;
}
} else {
$xtmp = $org_width/$width;
$new_width = $width;
$new_height = $org_height/$xtmp;
if ($new_height > $height){
$ytmp = $org_height/$height;
$new_height = $height;
$new_width = $org_width/$ytmp;
}
$width = round($new_width);
$height = round($new_height);
}
$img_n=imagecreatetruecolor ($width, $height);
imagecopyresampled($img_n, $img, 0, 0, $xoffset, $yoffset, $width, $height, $org_width, $org_height);
if($type=="gif")
{
imagegif($img_n, $dest);
}
elseif($type=="jpg")
{
imagejpeg($img_n, $dest);
}
elseif($type=="png")
{
imagepng($img_n, $dest);
}
elseif($type=="bmp")
{
imagewbmp($img_n, $dest);
}
Return true;
}
?>
info at lontronics dot nl
28-Oct-2005 03:08
For an internet photoalbum I was looking for a script which I could simply drop in a directory with images and which would do the rest.
Therefor I am using the following resize script now. I have made the little thumb-part because I want to have all the same size thumbnails, but with as less as possible distortion. Therefor, images with other dimensions are resized, but also cut off a little.
Als $pictype = thumb, the extra dimension calculations are used
$width and $height are the new dimensions of $filename, the image
$dest is the directory where the new image must be copied in.
The script:
// Resize function
function resize($filename, $dest, $width, $height, $pictype)
{
$format = strtolower(substr(strrchr($filename,"."),1));
switch($format)
{
case 'gif' :
$type ="gif";
$img = imagecreatefromgif($filename);
break;
case 'png' :
$type ="png";
$img = imagecreatefrompng($filename);
break;
case 'jpg' :
$type ="jpg";
$img = imagecreatefromjpeg($filename);
break;
case 'jpeg' :
$type ="jpg";
$img = imagecreatefromjpeg($filename);
break;
default :
die ("ERROR; UNSUPPORTED IMAGE TYPE");
break;
}
list($org_width, $org_height) = getimagesize($filename);
$xoffset = 0;
$yoffset = 0;
if ($pictype == "thumb") // To minimize destortion
{
if ($org_width / $width > $org_height/ $height)
{
$xtmp = $org_width;
$xratio = 1-((($org_width/$org_height)-($width/$height))/2);
$org_width = $org_width * $xratio;
$xoffset = ($xtmp - $org_width)/2;
}
elseif ($org_height/ $height > $org_width / $width)
{
$ytmp = $org_height;
$yratio = 1-((($width/$height)-($org_width/$org_height))/2);
$org_height = $org_height * $yratio;
$yoffset = ($ytmp - $org_height)/2;
}
}
$img_n=imagecreatetruecolor ($width, $height);
imagecopyresampled($img_n, $img, 0, 0, $xoffset, $yoffset, $width, $height, $org_width, $org_height);
if($type=="gif")
{
imagegif($img_n, $dest);
}
elseif($type=="jpg")
{
imagejpeg($img_n, $dest);
}
elseif($type=="png")
{
imagepng($img_n, $dest);
}
elseif($type=="bmp")
{
imagewbmp($img_n, $dest);
}
Return true;
}
Nicolas dot Grasset at notup2u dot net
20-Oct-2005 02:33
If you are looking for a function that can resample your photos to a given size, no matter its original size and/or ratio, here it is. And to make more fun (beacause life has to be fun), you can even chose a border size for the picture!
$position can either be topleft, topright, bottomleft, bottomright or center.
<?php
function imagecopyresampledselection($filename, $desired_width, $desired_height, $bordersize, $position)
{
list($width, $height) = getimagesize($filename);
if($desired_width/$desired_height > $width/$height):
$new_width = $desired_width;
$new_height = $height * ($desired_width / $width);
else:
$new_width = $width * ($desired_height / $height);
$new_height = $desired_height;
endif;
$image_p = imagecreatetruecolor($new_width, $new_height);
$image_f = imagecreatetruecolor($desired_width, $desired_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
switch($position)
{
case("topleft"):
$x = $bordersize;
$y = $bordersize;
break;
case("topright"):
$x = $new_width - $desired_width + $bordersize;
$y = $bordersize;
break;
case("bottomleft"):
$x = $bordersize;
$y = $new_height - $desired_height + $bordersize;
break;
case("bottomright"):
$x = $new_width - $desired_width + $bordersize;
$y = $new_height - $desired_height + $bordersize;
break;
case("center"):
$x = ($new_width - $desired_width) / 2 + $bordersize;
$y = ($new_height - $desired_height) / 2 + $bordersize;
break;
}
imagecopyresampled($image_f, $image_p, $bordersize, $bordersize, $x, $y, $desired_width - 2 * $bordersize,
$desired_height - 2 * $bordersize,
$desired_width - 2 * $bordersize,
$desired_height - 2 * $bordersize);
return $image_f;
}
$image_f = imagecopyresampledselection('test.jpg', 571, 319, 1, "center");
header('Content-type: image/jpeg');
imagejpeg($image_f, null, 100);
?>
To see a result, just browse http://www.notup2u.net/v8
Nicolas Grasset
11-Aug-2005 05:19
Here is my own custom utility which I call "Thumbnailer" (I know it is cheesy).
It's rather short, and it will take JPEG (you can change that easily), and
format it to a specified output width and height as a PNG
(or whatever else you choose):
<?php
$outWidth=100; $outHeight=75;
$imgSrc=imagecreatefromjpeg("[source]");
$srcWidth=imagesx($imgSrc);
$srcHeight=imagesy($imgSrc);
$imgOut=imagecreatetruecolor($outWidth,$outHeight);
imagerectangle($imgOut,0,0,$outWidth,$outHeight,
imagecolorallocate($imgOut,0,0,0));
$dx=0; $dy=0; $dw=$outWidth; $dh=$outHeight;
if ($outWidth*$srcHeight!=$outHeight*$srcWidth) { if ($srcWidth>$srcHeight) { $dw=$outWidth;
$dh=($dw*$srcHeight)/$srcWidth;
$dy=($outHeight-$dh)/2;
}
else { $dh=$outHeight;
$dw=($dh*$srcWidth)/$srcHeight;
$dx=($outWidth-$dw)/2;
}
}
imagecopyresampled($imgOut,$imgSrc,$dx,$dy,0,0,
$dw,$dh,$srcWidth,$srcHeight); imagepng($imgOut,"[out]");
echo "Image created successfully: $outWidth x $outHeight, ".round(filesize("[source]")/1024)." KB<br>";
imagedestroy($imgSrc);
imagedestroy($imgOut);
?>
I just use this as a loop to create thumbnails for a series of ordered images.
phpman at paodj dot net
19-Jul-2005 03:27
<?php
function img_resize($path,$w=0,$h=0,$quality=100,$save=''){
$image_data=@getimagesize($path);
$image_type=$image_data[2];
$gd_ext=array('','jpg','gif');
if($image_type!=1&&$image_type!=2) return false;
if($save=='') header('Content-type: '.$image_data['mime']); else $save=eregi_replace('%ext',$gd_ext[$image_type],$save);
if($w!=0){
$rapporto=$image_data[0]/$w;
if($h!=0){
if($image_data[1]/$rapporto>$h) $rapporto=$image_data[1]/$h;
}
}elseif($h!=0){
$tmp_h=$image_data[1]/$h;
}else{
return false;
}
$thumb_w=$image_data[0]/$rapporto;
$thumb_h=$image_data[1]/$rapporto;
if($image_type==1) $img_src=@imagecreatefromgif($path);
elseif($image_type==2) $img_src=@imagecreatefromjpeg($path);
$img_thumb=@imagecreatetruecolor($thumb_w,$thumb_h);
$result=@imagecopyresampled($img_thumb,$img_src,
0,0,0,0,$thumb_w,$thumb_h,$image_data[0],$image_data[1]);
if(!$img_src||!$img_thumb||!$result) return false;
if($image_type==1) $result=@imagegif($img_thumb,$save);
elseif($image_type==2) $result=@imagejpeg($img_thumb,$save,$quality);
return $result;
}
?>
This script resize images. It can also make thumbs. It use the resample of images for hight quality result.
It can show the result or save it (if $save isn't null).
It respect the width and/or the height of image.
It can replace the destination file extestion dinamically (filename.%ext)
Support gif & jpg.
Return false if something goes wrong.
04-Jul-2005 05:46
It should be noted that the imagecopyresampled() function is much more blurry than Photoshop CS's default bicubic funtion. And looks similar to a blury version of Photoshop's bilinear function. The documentation fails to note which algorithm is used in resampling.
Pie pie
25-May-2005 05:21
Confirming on what fluffle said, and to say his code will also crop and resize an image what is smaller than 100x100 pixels if you want. This is important because it means your images no matter how you decide to rezise them, will maintain their aspect ratios and with a minimum amount of image loss.
//Get file type
$mime = $orig_image_mimetype;
$type = substr($mime, strpos($mime,'/')+1);
switch($type) {
case 'jpeg':
case 'pjpeg':
$big = imagecreatefromjpeg($file);
break;
case 'png':
case 'x-png':
$big = imagecreatefrompng($file);
break;
case 'gif':
$big = imagecreatefromgif($file);
break;
default:
return FALSE;
break;
}
The above code is what I use to support multiple file type resizing. I then use the same thing again when it's time to output the image using $result = imagejpeg($thumb,'',80), imagepng($thumb), and imagegif($thumb).
fluffle <at> gmail <dot> com
21-May-2005 01:35
Just to clarify that src_w and src_h do not necessarily need to be the source image width and height, as they specify the size of the rectangle cropped from the source picture, with its top left corner situated at (src_x, src_y).
For example, the code below crops a jpeg image to be square, with the square situated in the centre of the original image, and then resizes it to a 100x100 thumbnail.
list($ow, $oh) = getimagesize($image_filename);
$big = imagecreatefromjpeg($image_filename);
$thumb = imagecreatetruecolor(100,100);
if ($ow > $oh) {
$off_w = ($ow-$oh)/2;
$off_h = 0;
$ow = $oh;
} elseif ($oh > $ow) {
$off_w = 0;
$off_h = ($oh-$ow)/2;
$oh = $ow;
} else {
$off_w = 0;
$off_h = 0;
}
imagecopyresampled($thumb, $big, 0, 0, $off_w, $off_h, 100, 100, $ow, $oh);
carnivorous_winds_fr AT yahoo DOT fr
18-May-2005 10:47
I tried this code from a previous post.
<?
...
$t_im = imageCreateTrueColor($t_wd,$t_ht);
imageAntiAlias($t_im,true);
imagealphablending($t_im, false);
imagesavealpha($t_im,true);
$transparent = imagecolorallocatealpha($t_im, 255, 255, 255, 0);
for($x=0;$x<$t_wd;$x++) {
for($y=0;$y<$t_ht;$y++) {
imageSetPixel( $t_im, $x, $y, $transparent );
}
}
imageCopyResampled($t_im, $o_im, 0, 0, 0, 0, $t_wd, $t_ht, $o_wd, $o_ht);
imagePNG($t_im, $image_name);
...
?>
It seems that it is not working correctly. In my test the source picture in ImageCopyResampled() is smaller than the destination picture $t_im, the remaining part is white !
I changed transparent alpha channel to 127, and I tried to replace loops with imagefilledrectangle().
It works fine and these resource greedy loops are removed.
Here is the code with my change.
<?
...
$t_im = imageCreateTrueColor($t_wd,$t_ht);
imageAntiAlias($t_im,true);
imagealphablending($t_im, false);
imagesavealpha($t_im,true);
$transparent = imagecolorallocatealpha($t_im, 255, 255, 255, 127);
imagefilledrectangle($t_img, 0, 0, $t_wd, $t_ht, $transparent);
imageCopyResampled($t_im, $o_im, 0, 0, 0, 0, $t_wd, $t_ht, $o_wd, $o_ht);
imagePNG($t_im, $image_name);
...
?>
del at kartoon dot net
05-May-2005 01:38
This snippet allows you to grab a thumbnail from the center of a large image. This was used for a client photo gallery for art to give a teaser of the image to come (only a small portion). You could get dynamic with this value. I also put in a scaling factor in case you want to scale down first before chopping.
<?php
$filename = 'moon.jpg';
$percent = 1.0; $imagethumbsize = 200; header('Content-type: image/jpeg');
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;
$image_p = imagecreatetruecolor($imagethumbsize , $imagethumbsize); $image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, -($new_width/2) + ($imagethumbsize/2), -($new_height/2) + ($imagethumbsize/2), 0, 0, $new_width , $new_width , $width, $height);
imagejpeg($image_p, null, 100);
?>
djneoform at gmail dot com
04-Mar-2005 06:21
Here's a function i made that will force a given set of constraints on an image (usrfull if you want to make thumbnails that are all the same size) while keeping aspect ratio.
It resizes, then crops the extra off the top or bottom.
function forceConstraints($srcFile, $srcType, $dstType, $dstWidth, $dstHeight, $dstPath)
{
if ($srcType == "image/jpeg")
$handle = @imagecreatefromjpeg($srcFile);
else if ($srcType == "image/png")
$handle = @imagecreatefrompng($srcFile);
else if ($srcType == "image/gif")
$handle = @imagecreatefromgif($srcFile);
else
return false;
if (!$handle)
return false;
$srcWidth = @imagesx($handle);
$srcHeight = @imagesy($handle);
if ($srcWidth >= $dstWidth && $srcHeight >= $dstHeight)
{
$newHandle = @imagecreatetruecolor($dstWidth, $dstHeight);
if (!$newHandle)
return false;
if($srcHeight < $srcWidth)
{
$ratio = (double)($srcHeight / $dstHeight);
$cpyWidth = round($dstWidth * $ratio);
if ($cpyWidth > $srcWidth)
{
$ratio = (double)($srcWidth / $dstWidth);
$cpyWidth = $srcWidth;
$cpyHeight = round($dstHeight * $ratio);
$xOffset = 0;
$yOffset = round(($srcHeight - $cpyHeight) / 2);
} else {
$cpyHeight = $srcHeight;
$xOffset = round(($srcWidth - $cpyWidth) / 2);
$yOffset = 0;
}
} else {
$ratio = (double)($srcWidth / $dstWidth);
$cpyHeight = round($dstHeight * $ratio);
if ($cpyHeight > $srcHeight)
{
$ratio = (double)($srcHeight / $dstHeight);
$cpyHeight = $srcHeight;
$cpyWidth = round($dstWidth * $ratio);
$xOffset = round(($srcWidth - $cpyWidth) / 2);
$yOffset = 0;
} else {
$cpyWidth = $srcWidth;
$xOffset = 0;
$yOffset = round(($srcHeight - $cpyHeight) / 2);
}
}
if (!@imagecopyresampled($newHandle, $handle, 0, 0, $xOffset, $yOffset, $dstWidth, $dstHeight, $cpyWidth, $cpyHeight))
return false;
@imagedestroy($handle);
if ($dstType == "png")
@imagepng($newHandle, $dstPath.".png");
else if ($dstType == "jpg")
@imagejpeg($newHandle, $dstPath.".jpg", 90);
else if ($dstType == "gif")
@imagegif($newHandle, $dstPath.".gif");
else
return false;
@imagedestroy($newHandle);
return true;
} else {
return "Sorry, that image is too small. The image must be at least ".$dstWidth."x".$dstHeight." pixels in size.";
}
}
afrowuk at tiscali dot co dot uk
02-Jan-2005 07:17
This simple function resizes a JPG image file giving just a maximum width, and resizes keeping the aspect ratio. This is useful if you have to resize a JPG image that must fit the width of i.e. a div element, but doesn't have to have a maximum height.
<?
function resizeJPG($jpgFile, $width) {
list($width_orig, $height_orig) = getimagesize($jpgFile);
$height = (int) (($width / $width_orig) * $height_orig);
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($jpgFile);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagejpeg($image_p, $jpgFile, 100);
}
?>
-Stu
stemplar444 at yahoo dot com
11-Aug-2004 10:57
Two comments regarding imageCopyResampleBicubic() published here.
Quality:
More grainy than imagecopyresampled(). Not very good for bigger destination images, I think.
Speed:
In my tests, it was only faster if destination size was smaller than ~200x200 pixel. The function becomes slower and slower the bigger the destination image gets. In contrast, imagecopyresampled() finished at the same speed, no matter how big the destination was. My source image resoloution ~ 1500x2000 pixel.
ron at korving dot demon dot nl
07-Aug-2004 02:25
This Bicubic resample algorithm is based on the one Scott posted earlier, only this one is about 50% faster for truecolor images and about 10% faster for palette images.
<?
function imageCopyResampleBicubic($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
{
$scaleX = ($src_w - 1) / $dst_w;
$scaleY = ($src_h - 1) / $dst_h;
$scaleX2 = $scaleX / 2.0;
$scaleY2 = $scaleY / 2.0;
$tc = imageistruecolor($src_img);
for ($y = $src_y; $y < $src_y + $dst_h; $y++)
{
$sY = $y * $scaleY;
$siY = (int) $sY;
$siY2 = (int) $sY + $scaleY2;
for ($x = $src_x; $x < $src_x + $dst_w; $x++)
{
$sX = $x * $scaleX;
$siX = (int) $sX;
$siX2 = (int) $sX + $scaleX2;
if ($tc)
{
$c1 = imagecolorat($src_img, $siX, $siY2);
$c2 = imagecolorat($src_img, $siX, $siY);
$c3 = imagecolorat($src_img, $siX2, $siY2);
$c4 = imagecolorat($src_img, $siX2, $siY);
$r = (($c1 + $c2 + $c3 + $c4) >> 2) & 0xFF0000;
$g = ((($c1 & 0xFF00) + ($c2 & 0xFF00) + ($c3 & 0xFF00) + ($c4 & 0xFF00)) >> 2) & 0xFF00;
$b = ((($c1 & 0xFF) + ($c2 & 0xFF) + ($c3 & 0xFF) + ($c4 & 0xFF)) >> 2);
imagesetpixel($dst_img, $dst_x + $x - $src_x, $dst_y + $y - $src_y, $r+$g+$b);
}
else
{
$c1 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY2));
$c2 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY));
$c3 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY2));
$c4 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY));
$r = ($c1['red'] + $c2['red'] + $c3['red'] + $c4['red'] ) << 14;
$g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) << 6;
$b = ($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue'] ) >> 2;
imagesetpixel($dst_img, $dst_x + $x - $src_x, $dst_y + $y - $src_y, $r+$g+$b);
}
}
}
}
?>
15-Jul-2004 05:09
In add to all the posts that describes how to create thumbnails:
If you are trying to resample a png image with its transparency you need to do this workaround:
<?
...
$t_im = imageCreateTrueColor($t_wd,$t_ht);
imageAntiAlias($t_im,true);
imagealphablending($t_im, false);
imagesavealpha($t_im,true);
$transparent = imagecolorallocatealpha($t_im, 255, 255, 255, 0);
for($x=0;$x<$t_wd;$x++) {
for($y=0;$y<$t_ht;$y++) {
imageSetPixel( $t_im, $x, $y, $transparent );
}
}
imageCopyResampled($t_im, $o_im, 0, 0, 0, 0, $t_wd, $t_ht, $o_wd, $o_ht);
imagePNG($t_im, $image_name);
...
?>
The alphablending must be off so the imagesavealpha can be true.
The double FORs is need to fix the problem with imagefill function that not support colors with alpha setted.
It is TO SLOWLIER than imagefill, but do a nice work with static images.
Take a look and enjoy the nice result.
(this workaround needs the gd2 library)
[s]
Pigmeu
| |