如何在 PHP 中调整图像的大小,保持纵横比、透明度(如果文件是图像gif
或png
图像),然后根据最终大小垂直或水平居中图像?
问问题
3647 次
6 回答
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;
}
于 2010-11-09T12:53:49.570 回答
1
如果
(...) 然后将图像垂直或水平居中 (...)
意味着您要在周围添加白色或黑色边框,我不会那样做。只需保存调整大小的图像并使用 html/css 在浏览器中进行居中。
于 2010-11-09T12:53:51.473 回答
1
供以后搜索
这是正确的答案
,我发现这个答案基于: 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;
}
于 2018-09-06T05:52:59.083 回答
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);
}
于 2010-11-09T12:56:02.100 回答
0
首先使用 getimagesize() 读取要调整大小的图像的图像大小;
计算出您希望调整大小的图像的最大宽度和高度。
找出要调整大小的图像的最大宽度或高度。
找出您必须将该边划分多少才能使其在调整大小的宽度或高度内。取该值,然后将要调整大小的图像的另一侧分开。
现在你有了调整后图像的宽度和高度。只需使用 imagecopyresampled()。
于 2010-11-09T12:56:41.593 回答
0
我过去使用过一个名为 Image_Transform (http://pear.php.net/package/Image_Transform) 的 PEAR 包。它有很多用于处理图像的强大功能,并且非常易于使用(不必是高级 PHP 程序员)
于 2010-11-09T12:57:06.480 回答