dp518158 2015-11-26 00:40
浏览 255
已采纳

调整图像大小并将每个图像调整为方形保持纵横比(后端)

I don't have any experience with PHP and images in general, but I have a need to resize all images into the square when they get uploaded.

Since I have multiple products and they have different pictures that comes in different sizes, I think that the best approach is to 'standardize' them during the upload by taking an image and 'fitting' it into the 800x800 white square while maintaining the aspect ratio (if longest size >800 then downsize, if longest size <800, then re-size).

My initial solution was created via JavaScript, where I tried to find the biggest picture and resize all other images according to it. Although, it is not very useful and can be faulty since if there is a delay in image load, images might not be loaded for JS to perform the operation, thus not showing images at all.

$product = getProductById($productid);

$filesArray = array();


if (isset($_GET['files']) && $productid > 0) {
    $error = false;
    $files = array();
    $fileName = '';

    $uploaddir = "../images/products/";
    foreach ($_FILES as $file) {
        $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
        $random_name = $widgets->randomFileName();
        $randomFullFileName = $productid .'_'. $random_name . '.' . $ext;

        //copy to location
        //----------------
        //HERE I NEED TO CREATE A 800x800px SQUARE and fit the image into it
        //----------------
        if (move_uploaded_file($file['tmp_name'], $uploaddir . $randomFullFileName)) {

            //save to database
            $image_id = updateProduct('default_image', 'images/products/'.$randomFullFileName, $productid);

            if ($image_id > 0) {
                echo 'Added new image';
            } else {
                echo 'Error, unable to add. <br> Please try again.';
            }
        } else {
            echo 'Error, unable to add. <br> Please try again.';
        }
    }
}

Before: 600x300 BEFORE

After: 800x800 with white borders to fill-in the space AFTER

  • 写回答

2条回答 默认 最新

  • dongqiang5865 2015-11-26 01:59
    关注

    You can try this approach (tested). It will fit your images into an 800x800 square canvas while maintaining the aspect ratio of your images.

    resize_image(): This function will maintain the aspect ratio of your image.

    function resize_image($img,$maxwidth,$maxheight) {
        //This function will return the specified dimension(width,height)
        //dimension[0] - width
        //dimension[1] - height
    
        $dimension = array();
        $imginfo = getimagesize($img);
        $imgwidth = $imginfo[0];
        $imgheight = $imginfo[1];
        if($imgwidth > $maxwidth){
            $ratio = $maxwidth/$imgwidth;
            $newwidth = round($imgwidth*$ratio);
            $newheight = round($imgheight*$ratio);
            if($newheight > $maxheight){
                $ratio = $maxheight/$newheight;
                $dimension[] = round($newwidth*$ratio);
                $dimension[] = round($newheight*$ratio);
                return $dimension;
            }else{
                $dimension[] = $newwidth;
                $dimension[] = $newheight;
                return $dimension;
            }
        }elseif($imgheight > $maxheight){
            $ratio = $maxheight/$imgheight;
            $newwidth = round($imgwidth*$ratio);
            $newheight = round($imgheight*$ratio);
            if($newwidth > $maxwidth){
                $ratio = $maxwidth/$newwidth;
                $dimension[] = round($newwidth*$ratio);
                $dimension[] = round($newheight*$ratio);
                return $dimension;
            }else{
                $dimension[] = $newwidth;
                $dimension[] = $newheight;
                return $dimension;
            }
        }else{
            $dimension[] = $imgwidth;
            $dimension[] = $imgheight;
            return $dimension;
        }
    }
    

    And now comes your code,

    $product = getProductById($productid);
    
    $filesArray = array();
    
    
    if (isset($_GET['files']) && $productid > 0) {
        $error = false;
        $files = array();
        $fileName = '';
    
        $uploaddir = "../images/products/";
        foreach ($_FILES as $file) {
            $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
            $random_name = $widgets->randomFileName();
            $randomFullFileName = $productid .'_'. $random_name . '.' . $ext;
    
            //copy to location
            //----------------
            //HERE I NEED TO CREATE A 800x800px SQUARE and fit the image into it
    
    
            // Create image from file
            $image = null;
            switch(strtolower($file['type']))
            {
                case 'image/jpeg':
                    $image = imagecreatefromjpeg($file['tmp_name']);
                    break;
                case 'image/png':
                    $image = imagecreatefrompng($file['tmp_name']);
                    break;
                case 'image/gif':
                    $image = imagecreatefromgif($file['tmp_name']);
                    break;
                default:
                    exit('Unsupported type: '.$file['type']);
            }
    
            // Get current dimensions
            $old_width  = imagesx($image);
            $old_height = imagesy($image);
    
            // Get the new dimensions
            $dimension = resize_image($file, 800, 800);
            $new_width  = $dimension[0];
            $new_height = $dimension[1];
    
            // Create new empty image
            $new = imagecreatetruecolor($new_width, $new_height);
    
            // Resize old image into new
            imagecopyresampled($new, $image, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);
    
            // Catch and save the image
            $status = false;
            switch(strtolower($file['type']))
            {
                case 'image/jpeg':
                    $status = imagejpeg($new, $uploaddir . $randomFullFileName, 90);
                    break;
                case 'image/png':
                    $status = imagepng($new, $uploaddir . $randomFullFileName, 0);
                    break;
                case 'image/gif':
                    $status = imagegif($new, $uploaddir . $randomFullFileName);
                    break;
            }
    
            // Destroy resources
            imagedestroy($image);
            imagedestroy($new);
    
            //save to database
            if($status){
                $image_id = updateProduct('default_image', 'images/products/'.$randomFullFileName, $productid);
    
                if ($image_id > 0) {
                    echo 'Added new image';
                } else {
                    echo 'Error, unable to add. <br> Please try again.';
                }
            }else{
                echo 'Error, unable to add. <br> Please try again.';
            }       
    
            //----------------
            //if (move_uploaded_file($file['tmp_name'], $uploaddir . $randomFullFileName)) {
            //    //save to database
            //    $image_id = updateProduct('default_image', 'images/products/'.$randomFullFileName, $productid);
    
            //    if ($image_id > 0) {
            //        echo 'Added new image';
            //    } else {
            //        echo 'Error, unable to add. <br> Please try again.';
            //    }
            //} else {
            //    echo 'Error, unable to add. <br> Please try again.';
            //}
    
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 51寻迹小车定点寻迹
  • ¥15 爬虫爬取网站的一些信息
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含
  • ¥15 麒麟V10桌面版SP1如何配置bonding
  • ¥15 Marscode IDE 如何预览新建的 HTML 文件