【问题标题】:resized image has black square in it调整大小的图像中有黑色方块
【发布时间】:2012-01-23 18:59:47
【问题描述】:

我正在尝试完成这个功能,它似乎工作得很好,除了一个小问题 - 它似乎将图像定位到左侧太远,然后用黑色填充其余空间。

我要做的是让这个函数将图像调整为指定的 $thumb_w,如果调整大小后高度最终大于 $thumb_h,它只会裁剪出底部。

这是我的功能代码:

function resize_upload ($tmp, $thumb_w, $thumb_h, $img_name, $img_ext, $img_path)
{
    if ($img_ext == 'jpg' || $img_ext == 'jpeg' || $img_ext == 'png' || $img_ext == 'gif')
    {
        if ($img_ext == 'jpg' || $img_ext == 'jpeg')
            $source_img = imagecreatefromjpeg($tmp);
        else if ($img_ext=='png')
            $source_img = imagecreatefrompng($tmp);
        else 
            $source_img = imagecreatefromgif($tmp);

        $orig_w = imagesx($source_img);
        $orig_h = imagesy($source_img);

        $w_ratio = ($thumb_w / $orig_w);
        $h_ratio = ($thumb_h / $orig_h);

        if ($orig_w > $orig_h ) 
        {
            $crop_w = round($orig_w * $h_ratio);
            $crop_h = $thumb_h;
            $src_x = ceil( ( $orig_w - $thumb_w ) / 2 );
            $src_y = 0;
        } 
        elseif ($orig_w < $orig_h ) 
        {
            $crop_h = round($orig_h * $w_ratio);
            $crop_w = $thumb_w;
            $src_x = 0;
            $src_y = ceil( ( $orig_h - $thumb_h ) / 2 );
        } 
        else 
        {
            $crop_w = $thumb_w;
            $crop_h = $thumb_h;
            $src_x = 0;
            $src_y = 0;
        }

        $thumb_img = imagecreatetruecolor($thumb_w,$thumb_h);

        imagecopyresampled($thumb_img, $source_img, 0 , 0 , $src_x, $src_y, $crop_w, $crop_h, $orig_w, $orig_h);

        imagejpeg($thumb_img, $img_path.'/'.$img_name.'.'.$img_ext, 100);

        imagedestroy($thumb_img);
        imagedestroy($source_img);
    }
}

这是我调用函数的方式:

resize_upload ($_FILES['image_main']['tmp_name'], 556, 346, $img_name, $img_ext, '../wp-content/themes/my-theme/images/projects');

这是函数完成其工作后图像最终的样子:

看到右边的黑色了吗?它可能是一些我无法弄清楚的数学问题。任何帮助将不胜感激。

【问题讨论】:

    标签: php image image-processing


    【解决方案1】:

    使用您帖子 $thumb_w = 556, $thumb_h = 346 中的相同变量,假设发送的图像尺寸完全相同,因此不需要调整大小 (556x346)。

        $orig_w = 556;
        $orig_h = 346;
    
        $w_ratio = 1;
        $h_ratio = 1;
    
        if (556 > 346) //true
        {
            $crop_w = round(556 * 1); // 556
            $crop_h = 346;
            $src_x = ceil( ( 556 - 346 ) / 2 ); // ceil( 210 / 2 ) == 105;
            $src_y = 0;
        } 
    
        ...
    
        $thumb_img = imagecreatetruecolor(556, 346);
    
        imagecopyresampled($thumb_img, $source_img, 0, 0, 105, 0, 556, 346, 556, 346);
    

    因此,您的代码从源图像的x = 105 开始,并尝试向其右侧移动 556 像素,但在该点之后仅存在 451 像素。因此,如果我发送了一张 556x346 的图像,它将复制图像水平部分的 105 到 556 像素的宽度,然后复制垂直部分的 0 到 346 像素的宽度。因此,图像的整个垂直部分都会显示出来,但不会显示整个宽度。

    我敢肯定,如果我们对高度大于宽度的图像进行相同的计算,我们也会遇到同样的问题,即在图像底部有黑色空间。

    提示:在编写公式和其他需要大量计算的东西时,请先用最简单的数字遍历它们。如果这些都不起作用,你显然做错了什么。

    【讨论】:

    • 谢谢。感谢您解释事情,所以我实际上不得不考虑它们,而不仅仅是给我正确的代码。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2013-12-24
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2010-12-18
    相关资源
    最近更新 更多