Php 如何在调整上传图像大小时保持纵横比

Php 如何在调整上传图像大小时保持纵横比,php,gd,Php,Gd,我有一个问题陈述,需要维护上传图像的纵横比 上传照片时,您需要创建三种尺寸,a) 310X230(Thumnail)b)960X400(详细图像)c)原始尺寸(全尺寸 图像)将使用精确的尺寸创建尺寸。如果照片是 不等于任何尺寸的长宽比,然后缩放到该尺寸, 然后修剪多余的部分 我已经使用PHPGD库实现了上传3种不同大小的图像,代码如下 if($_SERVER["REQUEST_METHOD"] == "POST") { $image =$_FILES["file"]["name

我有一个问题陈述,需要维护上传图像的纵横比

上传照片时,您需要创建三种尺寸,a) 310X230(Thumnail)b)960X400(详细图像)c)原始尺寸(全尺寸 图像)将使用精确的尺寸创建尺寸。如果照片是 不等于任何尺寸的长宽比,然后缩放到该尺寸, 然后修剪多余的部分

我已经使用PHPGD库实现了上传3种不同大小的图像,代码如下

    if($_SERVER["REQUEST_METHOD"] == "POST")
 {
    $image =$_FILES["file"]["name"];
    $uploadedfile = $_FILES['file']['tmp_name'];


    if ($image) 
    {

        $filename = stripslashes($_FILES['file']['name']);

        $extension = getExtension($filename);
        $extension = strtolower($extension);


 if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
        {

            $change='<div class="msgdiv">Unknown Image extension </div> ';
            $errors=1;
        }
        else
        {

 $size=filesize($_FILES['file']['tmp_name']);


if ($size > MAX_SIZE*1024)
{
    $change='<div class="msgdiv">You have exceeded the size limit!</div> ';
    $errors=1;
}


if($extension=="jpg" || $extension=="jpeg" )
{
$uploadedfile = $_FILES['file']['tmp_name'];
$src = imagecreatefromjpeg($uploadedfile);

}
else if($extension=="png")
{
$uploadedfile = $_FILES['file']['tmp_name'];
$src = imagecreatefrompng($uploadedfile);

}
else 
{
$src = imagecreatefromgif($uploadedfile);
}

//echo $src;

list($width,$height)=getimagesize($uploadedfile);


$newwidth=$width;
$newheight=($height/$width)*$newwidth;
$tmp=imagecreatetruecolor($newwidth,$newheight);


$newwidth1=310;
$newheight1=230;
$tmp1=imagecreatetruecolor($newwidth1,$newheight1);


$newwidth2=960;
$newheight2=400;
$tmp2=imagecreatetruecolor($newwidth2,$newheight2);

imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);

imagecopyresampled($tmp1,$src,0,0,0,0,$newwidth1,$newheight1,$width,$height);

imagecopyresampled($tmp2,$src,0,0,0,0,$newwidth2,$newheight2,$width,$height);

$filename = "images/medium/". $_FILES['file']['name'];

$filename1 = "images/thumbnail/small". $_FILES['file']['name'];

$filename2 = "images/full/". $_FILES['file']['name'];


imagejpeg($tmp,$filename,100);

imagejpeg($tmp1,$filename1,100);

imagejpeg($tmp2,$filename2,100);

imagedestroy($src);
imagedestroy($tmp);
imagedestroy($tmp1);
imagedestroy($tmp2);
}}

}
if($\u服务器[“请求\u方法”]=“发布”)
{
$image=$\u文件[“文件”][“名称”];
$uploadedfile=$\u文件['file']['tmp\u名称'];
如果($image)
{
$filename=stripslashes($_FILES['file']['name']);
$extension=getExtension($filename);
$extension=strtolower($extension);
如果(($extension!=“jpg”)&&($extension!=“jpeg”)&&($extension!=“png”)&&($extension!=“gif”))
{
$change='Unknown Image extension';
$errors=1;
}
其他的
{
$size=filesize($_FILES['file']['tmp_name']);
如果($size>MAX_size*1024)
{
$change='您已超过大小限制!';
$errors=1;
}
如果($extension==“jpg”| |$extension==“jpeg”)
{
$uploadedfile=$\u文件['file']['tmp\u名称'];
$src=imagecreatefromjpeg($uploadedfile);
}
else if($extension==“png”)
{
$uploadedfile=$\u文件['file']['tmp\u名称'];
$src=imagecreatefrompng($uploadedfile);
}
其他的
{
$src=imagecreatefromgif($uploadedfile);
}
//echo$src;
列表($width,$height)=getimagesize($uploadedfile);
$newwidth=$width;
$newheight=($height/$width)*$newwidth;
$tmp=imagecreatetruecolor($newwidth,$newheight);
$newwidth1=310;
$newheight1=230;
$tmp1=imagecreatetruecolor($newwidth1,$newheight1);
$newwidth2=960;
$newheight2=400;
$tmp2=imagecreatetruecolor($newwidth2,$newheight2);
imagecopyresampled($tmp、$src、0,0,0、$newwidth、$newheight、$width、$height);
imagecopyresampled($tmp1、$src、0,0,0、$newwidth1、$newheight1、$width、$height);
imagecopyresampled($tmp2,$src,0,0,0,$newwidth2,$newheight2,$width,$height);
$filename=“images/medium/”$_FILES['file']['name'];
$filename1=“images/缩略图/small”。$_FILES['file']['name'];
$filename2=“images/full/”$_FILES['file']['name'];
imagejpeg($tmp,$filename,100);
imagejpeg($tmp1,$filename1100);
imagejpeg($tmp2,$filename2100);
(1)(src);
图像处理(tmp);
图像处理(tmp1美元);
图像处理(tmp2美元);
}}
}

调整多个图像的大小和裁剪都非常复杂,但这里有一个可能适合您的解决方案:

 if($_SERVER["REQUEST_METHOD"] == "POST"){
    $image =$_FILES["file"]["name"];
    $uploadedfile = $_FILES['file']['tmp_name'];

    if($image){
        $filename = stripslashes($_FILES['file']['name']);
        $extension = getExtension($filename);
        $extension = strtolower($extension);

        if(($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) {
            $change='<div class="msgdiv">Unknown Image extension </div> ';
            $errors=1;
        } else {
            $size=filesize($_FILES['file']['tmp_name']);

            if($size > MAX_SIZE*1024){
                $change='<div class="msgdiv">You have exceeded the size limit!</div> ';
                $errors=1;
            }

            if($extension=="jpg" || $extension=="jpeg" ) {
                $uploadedfile = $_FILES['file']['tmp_name'];
                $src = imagecreatefromjpeg($uploadedfile);
            } else if($extension=="png"){
                $uploadedfile = $_FILES['file']['tmp_name'];
                $src = imagecreatefrompng($uploadedfile);
            } else {
                $src = imagecreatefromgif($uploadedfile);
            }


        list($width,$height)=getimagesize($uploadedfile);

        /* ORIGINAL ASPECT RATIO */     
        $original_aspect_ratio = $width / $height;

        /* RESIZE AND CROP THUMBNAIL (MEDIUM SIZE) */
        $new_width = 960; // SET DESIRED WIDTH
        $new_height = 400; // SET DESIRED HEIGHT    
        $new_aspect_ratio = $new_width / $new_height;

        if ($original_aspect_ratio > $new_aspect_ratio) {
            /* source image is wider */
            $temp_height = $new_height;
            $temp_width = (int) ($new_height * $original_aspect_ratio);
        } else {
            /* source image is similar or taller */
            $temp_width = $new_width;
            $temp_height = (int) ($new_width / $original_aspect_ratio);
        }

        /* Resize to a temporary GD image */
        $temp = imagecreatetruecolor($temp_width, $temp_height);
        imagecopyresampled($temp,$src,0,0,0,0,$temp_width,$temp_height,$width,$height);

        /* Copy cropped region from temporary image into the desired GD image */
        $x0 = ($temp_width - $new_width) / 2;
        $y0 = ($temp_height - $new_height) / 2;
        $medium = imagecreatetruecolor($new_width, $new_height);
        imagecopy($medium,$temp,0,0,$x0,$y0,$new_width,$new_height);

        /* SAVE TO FILE AND CLEAN UP */
        imagedestroy($temp);// CLEANUP TEMP IMAGE
        $medium_filename = "images/medium/". $_FILES['file']['name'];
        imagejpeg($medium,$medium_filename,100);
        imagedestroy($medium);

        /* RESIZE AND CROP SMALL IMAGES, SAME PROCEDURE AS ABOVE */
        $new_width = 310; // SET DESIRED WIDTH
        $new_height = 230; // SET DESIRED HEIGHT    
        $new_aspect_ratio = $new_width / $new_height;

        if ($original_aspect_ratio > $new_aspect_ratio) {
            $temp_height = $new_height;
            $temp_width = (int) ($new_height * $original_aspect_ratio);
        } else {
            $temp_width = $new_width;
            $temp_height = (int) ($new_width / $original_aspect_ratio);
        }

        $temp = imagecreatetruecolor($temp_width, $temp_height);
        imagecopyresampled($temp,$src,0,0,0,0,$temp_width,$temp_height,$width,$height);

        $x0 = ($temp_width - $new_width) / 2;
        $y0 = ($temp_height - $new_height) / 2;
        $small = imagecreatetruecolor($new_width, $new_height);
        imagecopy($small,$temp,0,0,$x0,$y0,$new_width,$new_height);

        /* SAVE TO FILE AND CLEAN UP */
        imagedestroy($temp);// CLEANUP TEMP IMAGE
        $small_filename = "images/thumbnail/small". $_FILES['file']['name'];
        imagejpeg($small,$small_filename,100);
        imagedestroy($small);


        /* ORIGINAL SIZE. NO RESIZING OR CROPPING... NOT NEEDED? YOU DECIDE... */           
        $full=imagecreatetruecolor($width,$height);
        imagecopyresampled($full,$src,0,0,0,0,$width,$height,$width,$height);

        /* SAVE TO FILE AND CLEAN UP */
        $full_filename = "images/full/". $_FILES['file']['name']; // ORIGINAL
        imagejpeg($full,$full_filename,100);
        imagedestroy($full);

        imagedestroy($src); // CLEAN UP ORIGINAL SOURCE FILE

        }
    }
}
if($\u服务器[“请求\u方法”]=“发布”){
$image=$\u文件[“文件”][“名称”];
$uploadedfile=$\u文件['file']['tmp\u名称'];
如果($image){
$filename=stripslashes($_FILES['file']['name']);
$extension=getExtension($filename);
$extension=strtolower($extension);
如果(($extension!=“jpg”)&&($extension!=“jpeg”)&&($extension!=“png”)&&($extension!=“gif”)){
$change='Unknown Image extension';
$errors=1;
}否则{
$size=filesize($_FILES['file']['tmp_name']);
如果($size>MAX_size*1024){
$change='您已超过大小限制!';
$errors=1;
}
如果($extension==“jpg”| |$extension==“jpeg”){
$uploadedfile=$\u文件['file']['tmp\u名称'];
$src=imagecreatefromjpeg($uploadedfile);
}else if($extension==“png”){
$uploadedfile=$\u文件['file']['tmp\u名称'];
$src=imagecreatefrompng($uploadedfile);
}否则{
$src=imagecreatefromgif($uploadedfile);
}
列表($width,$height)=getimagesize($uploadedfile);
/*原始纵横比*/
$original_aspect_ratio=$width/$height;
/*调整大小并裁剪缩略图(中等大小)*/
$new_width=960;//设置所需的宽度
$new_height=400;//设置所需高度
$new_aspect_ratio=$new_width/$new_height;
if($原始纵横比>$新纵横比){
/*源图像更宽*/
$temp_height=$new_height;
$temp\u width=(int)($new\u height*$original\u aspect\u ratio);
}否则{
/*源图像类似或更高*/
$temp_width=$new_width;
$temp\u height=(int)($new\u width/$original\u aspect\u ratio);
}
/*将大小调整为临时GD图像*/
$temp=ImageCreateTureColor($temp\u宽度,$temp\u高度);
imagecopyresampled($temp,$src,0,0,0,$temp_-width,$temp_-height,$width,$height);
/*将裁剪区域从临时图像复制到所需的GD图像中*/
$x0=($temp\u width-$new\u width)/2;
$y0=($temp\U height-$new\U height)/2;
$medium=ImageCreateTureColor($new\u width,$new\u height);
图像复制($medium、$temp、0,0、$x0、$y0、$new\u width、$new\u height);
/*保存到文件并清理*/
imagedestroy($temp);//清理临时映像
$medium\u filename=“images/medium/”$\u FILES['file']['name'];
imagejpeg($medium,$medium\u文件名,100);
图像处理(中等);
/*调整大小并裁剪小图像,步骤同上*/
$new_width=310;//设置所需的宽度
$new_height=230;//设置所需高度
$new_aspect_ratio=$new_width/$new_height;
if($原始纵横比>$新纵横比){
$temp_height=$new_height;
$temp\u width=(int)($new\u height*$original\u aspect\u ratio);
}否则{
$temp_width=$new_width;
$temp\u height=(int)($new\u width/$original\u aspect\u ratio);
}
$temp=ImageCreateTureColor($temp\u宽度,$temp\u高度);
imagecopyresampled($temp,$src,0,0,0,$temp_-width,$temp_-height,$width,$height);
$x0=($temp\u width-$new\u width)/2;
$y0=($temp_