duanduo0520 2012-12-31 00:11
浏览 196
已采纳

PHP按比例调整图像大小

I'm currently working on a script that shows thumbnails from a website on a mobile app, and I'm having problems with the "retina display". If the original image is big enough, I show a thumbnail with the double of the required size, and if it is not, I show it on the required size. Now, my function checks if it can be resized proportionally and if it can't, I resize it to the "min-width" or "min-height" and crop it from the center.

Here is the problem: if it detects that the image can't be shown on the double of size, "scale up" the cropped size until it reaches the limits of the original size, and I can't find a way to scale it right. (My main problem is that I'm not really good at maths :P).

For a more simple lecture:

  • This is the original size of the image: 600 x 301
  • This is the required/cropped size: 320 x 180
  • This is the size I want to get: 535 x 301. I got it from Photoshop, and is the result of scaling 320x180 up until it finds the limit of the original size.

PS: I know GD, so I only need the formula to calculate the size.

  • 写回答

2条回答 默认 最新

  • dongying6179 2012-12-31 00:16
    关注

    The same algorithm that scales down can also scale up. This is untested code, and it is only designed to scale down, but if you remove the "scale down" tests it might do the trick for you.

    <?php // RAY_image_resize_and_crop.php
    error_reporting(E_ALL);
    
    
    // RESIZE AN IMAGE PROPORTIONALLY AND CROP TO THE CENTER
    
    
    function resize_and_crop($original_image_url, $thumb_image_url, $thumb_w, $thumb_h, $quality=75)
    {
        // ACQUIRE THE ORIGINAL IMAGE: http://php.net/manual/en/function.imagecreatefromjpeg.php
        $original = imagecreatefromjpeg($original_image_url);
        if (!$original) return FALSE;
    
        // GET ORIGINAL IMAGE DIMENSIONS
        list($original_w, $original_h) = getimagesize($original_image_url);
    
        // RESIZE IMAGE AND PRESERVE PROPORTIONS
        $thumb_w_resize = $thumb_w;
        $thumb_h_resize = $thumb_h;
        if ($original_w > $original_h)
        {
            $thumb_h_ratio  = $thumb_h / $original_h;
            $thumb_w_resize = (int)round($original_w * $thumb_h_ratio);
        }
        else
        {
            $thumb_w_ratio  = $thumb_w / $original_w;
            $thumb_h_resize = (int)round($original_h * $thumb_w_ratio);
        }
        if ($thumb_w_resize < $thumb_w)
        {
            $thumb_h_ratio  = $thumb_w / $thumb_w_resize;
            $thumb_h_resize = (int)round($thumb_h * $thumb_h_ratio);
            $thumb_w_resize = $thumb_w;
        }
    
        // CREATE THE PROPORTIONAL IMAGE RESOURCE
        $thumb = imagecreatetruecolor($thumb_w_resize, $thumb_h_resize);
        if (!imagecopyresampled($thumb, $original, 0,0,0,0, $thumb_w_resize, $thumb_h_resize, $original_w, $original_h)) return FALSE;
    
        // ACTIVATE THIS TO STORE THE INTERMEDIATE IMAGE
        // imagejpeg($thumb, 'RAY_temp_' . $thumb_w_resize . 'x' . $thumb_h_resize . '.jpg', 100);
    
        // CREATE THE CENTERED CROPPED IMAGE TO THE SPECIFIED DIMENSIONS
        $final = imagecreatetruecolor($thumb_w, $thumb_h);
    
        $thumb_w_offset = 0;
        $thumb_h_offset = 0;
        if ($thumb_w < $thumb_w_resize)
        {
            $thumb_w_offset = (int)round(($thumb_w_resize - $thumb_w) / 2);
        }
        else
        {
            $thumb_h_offset = (int)round(($thumb_h_resize - $thumb_h) / 2);
        }
    
        if (!imagecopy($final, $thumb, 0,0, $thumb_w_offset, $thumb_h_offset, $thumb_w_resize, $thumb_h_resize)) return FALSE;
    
        // STORE THE FINAL IMAGE - WILL OVERWRITE $thumb_image_url
        if (!imagejpeg($final, $thumb_image_url, $quality)) return FALSE;
        return TRUE;
    }
    
    
    // USE CASE
    echo '<a target="_blank" href="RAY_orig_600x374.jpg">Original 600x374</a><br/>';
    
    resize_and_crop('RAY_orig_600x374.jpg', 'RAY_temp_100x100.jpg', 100, 100);
    echo '<a target="_blank" href="RAY_temp_100x100.jpg">100x100</a><br/>';
    
    resize_and_crop('RAY_orig_600x374.jpg', 'RAY_temp_200x100.jpg', 200, 100);
    echo '<a target="_blank" href="RAY_temp_200x100.jpg">200x100</a><br/>';
    
    resize_and_crop('RAY_orig_600x374.jpg', 'RAY_temp_200x300.jpg', 200, 300);
    echo '<a target="_blank" href="RAY_temp_200x300.jpg">200x300</a><br/>';
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog