Reputation: 69930
how do I resize an image in PHP keeping the aspect ratio, the transparency if the file is a gif
or a png
image, and then center the image vertically or horizontally depending on the final size?
Upvotes: 0
Views: 4300
Reputation: 779
For later search
This is the correct answer
I found this answer base on : http://php.net/manual/en/function.imagecopyresampled.php#112742
function resizeKeepRatio($path,$new_path,$width, $height){
$image_info = getimagesize($path);
$image_type = $image_info[2];
if ($image_type == IMAGETYPE_JPEG) {
$image = imagecreatefromjpeg($path);
} elseif ($image_type == IMAGETYPE_GIF) {
$image = imagecreatefromgif($path);
} elseif ($timage_type == IMAGETYPE_PNG) {
$image = imagecreatefrompng($path);
}else{
return false; // The image type does not support
}
$new_image = imagecreatetruecolor($width, $height);
$src_w = imagesx($image);
$src_h = imagesy($image);
if($src_w > $src_h){
$dst_w = $width;
$dst_h = ($dst_w * $src_h) / $src_w ;
if($dst_h > $height){
$dst_h = $height;
$dst_w = ($dst_h * $src_w) / $src_h;
}
}else{
$dst_h = $height;
$dst_w = ($dst_h * $src_w) / $src_h;
if($dst_w > $width){
$dst_w = $width;
$dst_h = ($dst_w * $src_h) / $src_w;
}
}
$dst_x = abs($width - $dst_w) / 2;
$dst_y = abs($height - $dst_h) / 2;
$color = imagecolorallocatealpha($new_image, 0, 0, 0, 127); //fill transparent background
if ($image_type != IMAGETYPE_PNG) {
$color = imagecolorallocatealpha($new_image, 255, 255, 255, 0); //fill white background
}
imagefill($new_image, 0, 0, $color);
imagesavealpha($new_image, true);
imagecopyresampled($new_image, $image, $dst_x, $dst_y,0,0, $dst_w, $dst_h, $src_w, $src_h);
if ($image_type == IMAGETYPE_JPEG) {
imagejpeg(new_image, $new_path);
} elseif ($image_type == IMAGETYPE_GIF) {
imagegif(new_image, $new_path);
} elseif ($image_type == IMAGETYPE_PNG) {
imagepng(new_image, $new_path);
}
return true;
}
Upvotes: 1
Reputation: 10517
there are several tricks. here is my func:
function im_resize($file_src,$file_dest,$wd,$hd) {
if (!file_exists($file_src)) return false;
$size = getimagesize($file_src);
if ($size === false) return false;
if ($size['mime']=='image/pjpeg') $size['mime'] = 'image/jpeg';
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$destformat = strtolower(substr($file_dest, -4));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) return false;
$src = $icfunc($file_src);
$ws = imagesx($src);
$hs = imagesy($src);
if ($ws >= $hs) {
$hd = ceil(($wd * $hs) / $ws);
}
else {
$wd = ceil(($hd*$ws)/$hs);
}
if ($ws <= $wd) {
$wd = $ws;
$hd = $hs;
}
$wc=($wd * $hs) / $hd;
if ($wc<=$ws) {
$hc=($wc * $hd) / $wd;
}
else {
$hc=($ws * $hd) / $wd;
$wc=($wd * $hc) / $hd;
}
$dest = imagecreatetruecolor($wd,$hd);
switch ($format) {
case "png":
imagealphablending( $dest, false );
imagesavealpha( $dest, true );
$transparent = imagecolorallocatealpha($dest, 255, 255, 255, 127);
imagefilledrectangle($dest, 0, 0, $nw, $nh, $transparent);
break;
case "gif":
// integer representation of the color black (rgb: 0,0,0)
$background = imagecolorallocate($src, 0, 0, 0);
// removing the black from the placeholder
imagecolortransparent($src, $background);
break;
}
imagecopyresampled($dest,$src,0,0,($ws-$wc)/2,($hs-$hc)/2, $wd, $hd, $wc, $hc);
if (!isset($q)) $q = 100;
if ($destformat=='.png') $saved=imagepng($dest,$file_dest);
if ($destformat=='.jpg') $saved=imagejpeg($dest,$file_dest,$q);
if (!$saved) my_error_log('saving failed');
imagedestroy($dest);
imagedestroy($src);
@chmod($file_dest, 0666);
return true;
}
Upvotes: 2
Reputation: 10548
There's a PEAR package called Image_Transform (http://pear.php.net/package/Image_Transform) that I've used in the past. It has a lot of great functions for manipulating images and it's very easy to use (don't have to be an advanced PHP programmer)
Upvotes: 0
Reputation: 3967
Firstly read in the image size of the image you want to resize using getimagesize();
Work out what the max width and height you want your resized image to be.
Find out which is the largest, the width or the height of your image to be resized.
Find out how much you have to devide that side to make it within the width or height of the resized. Take that value then devide the other side of the image to be resized.
Now you have your resulting width and height of the resized image. just use imagecopyresampled().
Upvotes: 0
Reputation: 1991
// ---------------------------------------------------------------------------------
// Resize Image
// ---------------------------------------------------------------------------------
function ResizeImage($FileName,$SaveFile, $MaxWidth, $MaxHeight = null) {
$extension = GetFileExtension($FileName);
switch(strtolower($extension)) {
case "gif":
$objImage = imagecreatefromgif($FileName);
break;
case "png":
$objImage = imagecreatefrompng($FileName);
break;
default:
$objImage = imagecreatefromjpeg($FileName);
break;
}
list($width, $height, $type, $attr) = getimagesize($FileName);
$TargetWidth = $width;
$TargetHeight = $height;
if (!is_null($MaxWidth)) {
if ($MaxWidth < $TargetWidth) {
$TargetWidth = $MaxWidth;
$TargetHeight = round($TargetHeight * $TargetWidth / $width);
}
}
if (!is_null($MaxHeight)) {
if ($MaxHeight < $TargetHeight) {
$TargetHeight = $MaxHeight;
$TargetWidth = round($TargetWidth * $TargetHeight / $height);
}
}
$DestImage = imagecreatetruecolor($TargetWidth, $TargetHeight);
// handle transparancy
if ( ($type == IMAGETYPE_GIF) || ($type == IMAGETYPE_PNG) ) {
$trnprt_indx = imagecolortransparent($objImage);
// If we have a specific transparent color
if ($trnprt_indx >= 0) {
// Get the original image's transparent color's RGB values
$trnprt_color = imagecolorsforindex($objImage, $trnprt_indx);
// Allocate the same color in the new image resource
$trnprt_indx = imagecolorallocate($DestImage, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
// Completely fill the background of the new image with allocated color.
imagefill($DestImage, 0, 0, $trnprt_indx);
// Set the background color for new image to transparent
imagecolortransparent($DestImage, $trnprt_indx);
} elseif ($type == IMAGETYPE_PNG) {
// Turn off transparency blending (temporarily)
imagealphablending($DestImage, false);
// Create a new transparent color for image
$color = imagecolorallocatealpha($DestImage, 0, 0, 0, 127);
// Completely fill the background of the new image with allocated color.
imagefill($DestImage, 0, 0, $color);
// Restore transparency blending
imagesavealpha($DestImage, true);
}
}
imagecopyresampled($DestImage, $objImage, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $width, $height);
switch(strtolower($extension)) {
case "gif":
imagegif($DestImage, $SaveFile);
break;
case "png":
imagepng($DestImage, $SaveFile,0);
break;
default:
imagejpeg($DestImage,$SaveFile,100);
break;
}
}
// ---------------------------------------------------------------------------------
// GetFileExtension
// ---------------------------------------------------------------------------------
function GetFileExtension($inFileName) {
return substr($inFileName, strrpos($inFileName, '.') + 1);
}
Upvotes: 0
Reputation: 4585
If
(…) then center the image vertically or horizontally (…)
means that you want to add a white or black border around, I wouldn't do that. Just save the resized image and do the centering in the browser using html/css.
Upvotes: 1