我正在使用此功能
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宽度而不失真。
有谁知道怎么做?
答案 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;
}
}