用缩放比例调整图像大小?
问题描述:
我使用这个功能用缩放比例调整图像大小?
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×180,我需要调整大小到150×150
我可以将图像的大小调整为150高度它击中此功能之前。
我不知道该怎么做就是取宽度并切掉边缘以获得150宽度而不失真。
有谁知道如何做到这一点?
答
通过“砍掉”我猜边你的意思是使作物你的形象,对不对?您可以使用来裁剪图像。
一个小例子:
$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.
答
这是从我的一个老项目复制,做你所需要的:
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);
}
答
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;
}
}
所以你要调整前裁剪图像方?为什么不调整保持纵横比然后裁剪哪个尺寸大于150? – Treffynnon 2011-03-15 09:32:38
如果您不想陷入低级映像操作,强烈建议使用wideimage库(http://wideimage.sourceforge.net/)。 – 2011-03-15 09:33:12