在不知道两个维度的情况下按比例缩放图像

时间:2018-04-30 06:38:45

标签: php

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无效。我没有保持宽高比。

2 个答案:

答案 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完全相同。