如何在PHP中调整图像大小,保持宽高比,如果文件是gif
或png
图像,则透明度,然后根据最终大小垂直或水平居中图像?
答案 0 :(得分:2)
有几个技巧。这是我的功能:
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;
}
答案 1 :(得分:1)
如果
(...)然后垂直或水平居中图像(...)
意味着您想要添加白色或黑色边框,我不会这样做。只需保存已调整大小的图像,然后使用html / css在浏览器中进行居中。
答案 2 :(得分:0)
// ---------------------------------------------------------------------------------
// 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);
}
答案 3 :(得分:0)
首先使用getimagesize();
读入要调整大小的图像的图像大小确定您希望调整大小的图像的最大宽度和高度。
找出要调整大小的图像的最大宽度或高度。
了解您需要多少距离才能使其在调整大小的宽度或高度范围内。取该值,然后将图像的另一侧分开以进行调整大小。
现在,您可以获得调整后的图像的最终宽度和高度。只需使用imagecopyresampled()。
答案 4 :(得分:0)
我曾经使用过一个名为Image_Transform(http://pear.php.net/package/Image_Transform)的PEAR包。它具有许多用于处理图像的强大功能,并且它非常易于使用(不必是高级PHP程序员)
答案 5 :(得分:0)
以供以后搜索
这是正确的答案
我发现此答案的依据是: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;
}