我需要将图片大小调整为固定大小.但它必须保持宽度和高度之间的因素.
说我要调整从图片238 (w) X 182 (h)到210 / 150
我现在做的是:
Original width / target width = 1.333333
Original Height / target Height = 1.213333
Run Code Online (Sandbox Code Playgroud)
现在我采取最小的因素.
现在我总是有正确的宽度238 / 1.333333 = 210.但高度依然存在160.
如何在160不破坏照片的情况下降低高度?
我需要裁剪吗?如果是这样的话?
gnu*_*nud 26
这个解决方案与CanBerkGüder的解决方案基本相同,但在花了一些时间写作和评论之后,我觉得要张贴.
此功能创建的缩略图与您提供的缩放尺寸完全一样大.调整图像大小以最适合缩略图的大小.如果它不完全适合两个方向,它会在thumnail中居中.广泛的评论解释了这些事情.
function thumbnail_box($img, $box_w, $box_h) {
//create the image, of the required size
$new = imagecreatetruecolor($box_w, $box_h);
if($new === false) {
//creation failed -- probably not enough memory
return null;
}
//Fill the image with a light grey color
//(this will be visible in the padding around the image,
//if the aspect ratios of the image and the thumbnail do not match)
//Replace this with any color you want, or comment it out for black.
//I used grey for testing =)
$fill = imagecolorallocate($new, 200, 200, 205);
imagefill($new, 0, 0, $fill);
//compute resize ratio
$hratio = $box_h / imagesy($img);
$wratio = $box_w / imagesx($img);
$ratio = min($hratio, $wratio);
//if the source is smaller than the thumbnail size,
//don't resize -- add a margin instead
//(that is, dont magnify images)
if($ratio > 1.0)
$ratio = 1.0;
//compute sizes
$sy = floor(imagesy($img) * $ratio);
$sx = floor(imagesx($img) * $ratio);
//compute margins
//Using these margins centers the image in the thumbnail.
//If you always want the image to the top left,
//set both of these to 0
$m_y = floor(($box_h - $sy) / 2);
$m_x = floor(($box_w - $sx) / 2);
//Copy the image data, and resample
//
//If you want a fast and ugly thumbnail,
//replace imagecopyresampled with imagecopyresized
if(!imagecopyresampled($new, $img,
$m_x, $m_y, //dest x, y (margins)
0, 0, //src x, y (0,0 means top left)
$sx, $sy,//dest w, h (resample to this size (computed above)
imagesx($img), imagesy($img)) //src w, h (the full size of the original)
) {
//copy failed
imagedestroy($new);
return null;
}
//copy successful
return $new;
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$i = imagecreatefromjpeg("img.jpg");
$thumb = thumbnail_box($i, 210, 150);
imagedestroy($i);
if(is_null($thumb)) {
/* image creation or copying failed */
header('HTTP/1.1 500 Internal Server Error');
exit();
}
header('Content-Type: image/jpeg');
imagejpeg($thumb);
Run Code Online (Sandbox Code Playgroud)
Can*_*der 11
这不会裁剪图片,但如果需要,会在新图像周围留出空间,我认为在创建缩略图时这是一种更好的方法(而不是裁剪).
$w = 210;
$h = 150;
$orig_w = imagesx($original);
$orig_h = imagesy($original);
$w_ratio = $orig_w / $w;
$h_ratio = $orig_h / $h;
$ratio = $w_ratio > $h_ratio ? $w_ratio : $h_ratio;
$dst_w = $orig_w / $ratio;
$dst_h = $orig_h / $ratio;
$dst_x = ($w - $dst_w) / 2;
$dst_y = ($h - $dst_h) / 2;
$thumbnail = imagecreatetruecolor($w, $h);
imagecopyresampled($thumbnail, $original, $dst_x, $dst_y,
0, 0, $dst_w, $dst_h, $orig_w, $orig_h);
Run Code Online (Sandbox Code Playgroud)