Изменить размер изображения с масштабом? - PullRequest
2 голосов
/ 15 марта 2011

Я использую эту функцию

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 ]

2 голосов
/ 15 марта 2011

"Отрезать" край, я думаю, вы имеете в виду обрезку вашего изображения, верно?

Для обрезки изображения вы можете использовать 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 голосов
/ 15 марта 2011
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 голосов
/ 15 марта 2011

Это скопировано из моего старого проекта, делает то, что вам нужно:

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