用比例尺调整图像大小?

时间:2011-03-15 09:20:32

标签: php image-processing image-manipulation

我正在使用此功能

function resize($width,$height) {

    $new_image = imagecreatetruecolor($width, $height);

    imagesavealpha($new_image, true);
    $trans_colour = imagecolorallocatealpha($new_image, 0, 0, 0, 127);
    imagefill($new_image, 0, 0, $trans_colour); 

    imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
    $this->image = $new_image;
}

我想做的是制作方形图像。我想通过最小的属性来调整大小,而不是被压扁的大数字。我想把边缘切掉。

所以如果我有一个213 x 180的图像,我需要将其调整为150 x 150

我可以在达到此功能之前将图像调整到150高度。

我不知道怎么做是取宽度并切掉边缘以获得150宽度而不失真。

有谁知道怎么做?

3 个答案:

答案 0 :(得分:2)

这是从我的一个旧项目复制而来,做你需要的:

  static public function resizeCropAndMove($from_path, $to_path, $max_width, $max_height)
  {
    $image_info = getImageSize($from_path); 
    switch ($image_info['mime']) {
      case 'image/jpeg':  $input = imageCreateFromJPEG($from_path);  break;
      default:
        return false;
    }

   $input_width =  imagesx($input);
   $input_height = imagesy($input);

   $output = imageCreateTrueColor($max_width, $max_height);

   if ($input_width <= $input_height) { //portrait
     $lamda = $max_width / $input_width;

     if ($lamda < 1) {
       $temp_width = (int)round($lamda * $input_width);
       $temp_height = (int)round($lamda * $input_height);

       $temp = imagecreatetruecolor($temp_width, $temp_height);
       imageCopyResampled($temp, $input, 0, 0, 0, 0, $temp_width, $temp_height, $input_width, $input_height);

       $top = (int)round(($temp_height - $max_height) / 2);
       $left = 0;
     }      
   } else { //landscape
     $lamda = $max_height / $input_height;

     if ($lamda < 1) {
       $temp_width = (int)round($lamda * $input_width);
       $temp_height = (int)round($lamda * $input_height);

       $temp = imagecreatetruecolor($temp_width, $temp_height);
       imageCopyResampled($temp, $input, 0, 0, 0, 0, $temp_width, $temp_height, $input_width, $input_height);

       $left = (int)round(($temp_width - $max_width) / 2);
       $top = 0;
     }
   }

   if ($lamda < 1)  {
    imageCopyResampled($output, $temp, 0, 0, $left, $top, $max_width, $max_height, $max_width, $max_height);
    imagePNG($output, $to_path);
    imagedestroy($temp);
   } else {
     imagePNG($input, $to_path);
   }

   imageDestroy($input);
   imageDestroy($output);
  }

答案 1 :(得分:2)

通过“切断”边缘,我猜你的意思是制作你的图像,对吗?

对于裁剪图像,您可以使用imagecopyresized

一个小例子:

$imageSrc = //Your source image;
$tempImage = imagecreatetruecolor(150,150);
// CropStartX et cropStartY have to be computed to suit your needs
imagecopyresized($tempImage,$imageSrc,0,0,$cropStartX,$cropStartY,150,150,150,150);
// $tempImage now contain your cropped image.

答案 2 :(得分:2)

function createCroppedThumb($thumbSourcePath, $thumbSavePath, $thumbDim){

       // Get dimensions of the original image
        $detail             = getimagesize($thumbSourcePath);
        $current_width      = $detail[0];
        $current_height     = $detail[1];
        $imageType          = $detail[2];

        // The x and y coordinates on the original image where we
        // will begin cropping the image
        $left = 0;
        $top  = 0;

        // This will be the final size of the image (e.g. how many pixels
        // left and down we will be going)
        $crop_width     = $thumbDim;
        $crop_height    = $thumbDim;

        // Resample the image
        $canvas = imagecreatetruecolor($crop_width, $crop_height);

        switch($imageType){
            case '1':
            $current_image  = imagecreatefromgif($thumbSourcePath);
            break;

            case '2':
            $current_image  = imagecreatefromjpeg($thumbSourcePath);
            break;

            case '3':
            $current_image  = imagecreatefrompng($thumbSourcePath);
            break;

            default:
            throw new Exception('unknown image type');
            break;      
        }
        imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);

        switch($imageType){
            case '1':
            imagegif($canvas,$thumbSavePath,100);
            break;

            case '2':
            imagejpeg($canvas,$thumbSavePath,100);
            break;

            case '3':
            imagepng($canvas,$thumbSavePath,100);
            break;

            default:
            throw new Exception('unknown image type');
            break;      
        }
}