项目要求将图片上传的任意图片按固定比例进行转换,没办法自己就写了一个,代码如下:
public function cropImage($imagePath, $savePath, $scale){
$imgHandler = $this->model('Picture_Model_Image');
$imgHandler->setSrcImg($imagePath);
$imgHandler->setCutType(2);//指明为手工裁切
list($scaleW, $scaleH) = explode(':', $scale);
$imgH = $imgHandler->src_h;
$imgW = $imgHandler->src_w;
if(($imgW / $scaleW * $scaleH) < $imgH){
$cropH = ($imgW / $scaleW * $scaleH);
$cropW = $imgW;
}else{
$cropW = $imgH / $scaleH * $scaleW;
$cropH = $imgH;
}
$cropInitX = ($imgW - $cropW) / 2;
$cropInitY = ($imgH - $cropH) / 2;
$imgHandler->setSrcCutPosition($cropInitX, $cropInitY);// 源图起点座标
$imgHandler->setRectangleCut($cropW, $cropH);// 裁切尺寸
$imgHandler->setDstImg($savePath);
return $imgHandler->createImg($cropW, $cropH);
}
大概思路是这样的:
cropW 和 cropH 是需要裁剪的图片的大小,
cropInitX 和 cropInitY 是裁剪的初始位置,默认是取最中间的位置
首先是根据图片的宽, 按照比例算出 高按照比例的尺寸 ,如果算出的高, 比图片的高大, 那么就
图片的高, 按照比例算出 宽按照比例的尺寸。得到尺寸后, (用原图的宽/裁剪后的宽)/2 就可以得到裁剪的X座标,依次类推。