【问题标题】:Resize image with scale?用比例调整图像大小?
【发布时间】:2011-07-15 15:29:46
【问题描述】:

我正在使用这个功能

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 宽度而不会变形。

有人知道怎么做吗?

【问题讨论】:

  • 所以你想在调整大小之前裁剪图像正方形?为什么不调整大小保持纵横比,然后裁剪掉大于 150 的尺寸?
  • 如果你不想搞低级图像操作,强烈推荐使用宽图像库(wideimage.sourceforge.net)。

标签: php image-processing image-manipulation


【解决方案1】:
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;      
        }
}

【讨论】:

    【解决方案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.
    

    【讨论】:

      【解决方案3】:

      这是从我的一个旧项目中复制的,可以满足您的需要:

        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);
        }
      

      【讨论】:

        猜你喜欢
        • 2011-09-20
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多