1%, 2.5%, 5%, 7.5%, 10%, 12.5%, 15%... 30%
现在我需要按比例缩放此图像,但不要提前知道这两个尺寸。
$newimg = imagecreatefromjpeg($tempname);
或
$newimg = imagescale($newimg, 160, auto, IMG_BICUBIC); //doesn't work
有没有办法说$newimg = imagescale($newimg, auto, 160, IMG_BICUBIC); // doesn't work
或其他东西自动计算宽度或高度。
如果不是,我该如何计算?
已接受的解决方案here无效。我没有保持宽高比。
答案 0 :(得分:0)
首先,您必须提及至少一个维度(高度或宽度),然后使用原始图像的纵横比,您可以识别另一个维度。这是我在我的案例中使用的示例代码:
$width = 160; // User-defined
$height = ''; // User-defined
$path = $uploadDir . '/' . $tempname;
$mime = getimagesize($path);
// Load original image
if($mime['mime']=='image/png') {
$orig_img = imagecreatefrompng($path);
}
if($mime['mime']=='image/jpg' || $mime['mime']=='image/jpeg' || $mime['mime']=='image/pjpeg') {
$orig_img = imagecreatefromjpeg($path);
}
// Get original image height and width
$width_orig = imagesx($orig_img);
$height_orig = imagesy($orig_img);
// Aspect ratio of original image
$aspectRatio = $width_orig / $height_orig;
// If any one dimension available then calculate other with the help of aspect-ratio of original image
if ($width == '' && $height != '') {
$newheight = $height;
$newwidth = round($height * $aspectRatio);
}
if ($width != '' && $height == '') {
$newheight = round($width / $aspectRatio);
$newwidth = $width;
}
$newimg = imagescale($orig_img, $newwidth, $newheight, IMG_BICUBIC);
答案 1 :(得分:-1)
我做了一个可以满足你需要的功能。我已经通过缩小图像测试了这个功能,它按预期工作。
此功能会调整保持宽高比的图像大小,使其完全适合您指定的尺寸。图像也将居中。
该功能还具有裁剪功能。如果使用裁剪参数,它将使图像尺寸过大,以确保图像的最小边填充所需的尺寸。然后,它将裁剪图像以适合尺寸,从而完全填充给定的尺寸。图像将居中。
这是功能:
function scaleMyImage($filePath, $newPath, $newSize, $crop = NULL){
$img = imagecreatefromstring(file_get_contents($filePath));
$dst_x = 0;
$dst_y = 0;
$width = imagesx($img);
$height = imagesy($img);
$newWidth = $newSize;
$newHeight = $newSize;
if($width < $height){ //Portrait.
if($crop){
$newWidth = floor($width * ($newSize / $width));
$newHeight = floor($height * ($newSize / $width));
$dst_y = (floor(($newHeight - $newSize)/2)) * -1;
}else{
$newWidth = floor($width * ($newSize / $height));
$newHeight = $newSize;
$dst_x = floor(($newSize - $newWidth)/2);
}
} elseif($width > $height) { //Landscape
if($crop){
$newWidth = floor($width * ($newSize / $height));
$newHeight = floor($height * ($newSize / $height));
$dst_x = (floor(($newWidth - $newSize)/2)) * -1;
}else{
$newWidth = $newSize;
$newHeight = floor($height * ($newSize / $width));
$dst_y = floor(($newSize - $newHeight)/2);
}
}
$finalImage = imagecreatetruecolor($newSize, $newSize);
imagecopyresampled($finalImage, $img, $dst_x, $dst_y, 0, 0, $newWidth, $newHeight, $width, $height);
imagejpeg($finalImage, $newPath, 60); //Set your compression.
imagedestroy($img);
imagedestroy($finalImage);
}
使用方法:
$newSize = 160;
$filePath = 'path/myImg.jpg';
$newPath = 'path/newImg.jpg';
$crop = 1; //Set to NULL if you don't want to crop.
scaleMyImage($filePath, $newPath, $newSize, 1);
这应该与crop参数设置为1完全相同。