我试图完成这个功能,它似乎工作得很好,除了一个小问题 - 它似乎将图像定位在左边太远,然后用黑色填充剩余的空间。
我要做的是让这个函数将图像大小调整为指定的$ 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');
继承人看到图像最终看起来像是在功能完成之后:
看到右侧的黑色?它可能是一些我无法弄清楚的数学问题。任何帮助将不胜感激。
答案 0 :(得分:4)
使用帖子$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。因此,图像的整个垂直部分显示,但不是全部宽度。
我敢肯定,如果我们使用高度大于宽度的图像进行相同的计算,我们会遇到与图像底部有黑色空间相同的问题。
提示:在编写需要大量计算的公式和其他内容时,请先使用最简单的数字进行处理。如果那些不起作用,你显然做错了。