目标:识别裁剪图片大小与原图大小最大限度裁剪原图指定部分的功能
我将常用的裁剪图片概括为此6种情况,正方形可近似看作长方形,程序逻辑:根据裁剪尺寸和原图尺寸判定横图裁剪或竖图裁剪->根据自定义参数计算保留区域->执行裁剪
代码如下:
<?php /** * 生成缩略图,支持jpeg,png,gif,bmp * @author lgt 20120929 */ class Thumb{ private $input; private $width; private $height; private $output; // 文件目录 private $cut; private $pathinfo; private $imageinfo; private $image; private $newimg; // 文件名称 public $newfile; function __construct ($input, $width, $height, $cut = 0, $output = false){ $this->input = $input; $this->width = $width; $this->height = $height; $this->output = $output; $this->cut = $cut; if (file_exists($input) == false) { die('thumb file "' . $input . '" not exist'); } $this->pathinfo = pathinfo($input); if ($this->output == false) { $this->output = str_replace('\\', '/', $this->pathinfo['dirname']) . '/'; } if (is_writeable($this->output) == false) { die('thumb dir "' . $this->output . '" is not writeable'); } $this->newfile = $this->pathinfo['filename'] . '_' . $this->width . '_' .$this->height . '.' . $this->pathinfo['extension']; if (file_exists($this->output . $this->newfile)) { return; } $this->imageinfo = getimagesize($input); $type = $this->getType($input); // 获取图片类型 eval('$this->image=imagecreatefrom' . $type . '($input);'); // 拷贝源文件副本 $this->newimg = imagecreatetruecolor($width, $height); $bgColor = imagecolorallocate($this->newimg, 255, 255, 255); imagefill($this->newimg, 0, 0, $bgColor); $this->setImage($width, $height); // 进行裁剪 $this->saveImage($type); // 保存图片 } /** * 获取图片类型 * * @param string $file */ private function getType ($file) { $file = fopen($file, "rb"); $bin = fread($file, 2); // 只读2字节 fclose($file); $strInfo = @unpack("C2chars", $bin); $typeCode = intval($strInfo['chars1'] . $strInfo['chars2']); switch ($typeCode) { case 7173: return 'gif'; break; case 6677: return 'bmp'; break; case 13780: return 'png'; break; case 255216: default: return 'jpeg'; } } /** * 生成缩略图 * @param $width * @param $height */ private function setImage ($width, $height) { $proportion = ($this->imageinfo[0] / $this->imageinfo[1] - $width / $height); // $proportion>=0则按高度,$proportion<0则按宽度 if ($this->cut == 0) { // 不裁剪 if (imagecopyresampled($this->newimg, $this->image, 0, 0, 0, 0, $width,$height, $this->imageinfo[0], $this->imageinfo[1]) == false) { die('resize failed'); } } elseif ($this->cut == 1) { // 从左端裁剪 if ($proportion < 0) { if (imagecopyresampled($this->newimg, $this->image, 0, 0, 0, 0, $width, $height, $width * ($this->imageinfo[0] / $width), $height * ($this->imageinfo[0] / $width)) == false) { die('resize failed'); } } else { if (imagecopyresampled($this->newimg, $this->image, 0, 0, 0, 0, $width, $height, $width * ($this->imageinfo[1] / $height), $height * ($this->imageinfo[1] / $height)) == false) { die('resize failed'); } } } elseif ($this->cut == 2) { // 从中间裁剪 if ($proportion < 0) { $y = ($this->imageinfo[1] - $height * ($this->imageinfo[0] / $width)) / 2; if (imagecopyresampled($this->newimg, $this->image, 0, 0, 0, $y, $width, $height, $width * ($this->imageinfo[0] / $width), $height * ($this->imageinfo[0] / $width)) == false) { die('resize failed'); } } else { $x = ($this->imageinfo[0] - $width * ($this->imageinfo[1] / $height)) / 2; if (imagecopyresampled($this->newimg, $this->image, 0, 0, $x, 0, $width, $height, $width * ($this->imageinfo[1] / $height), $height * ($this->imageinfo[1] / $height)) == false) { die('resize failed'); } } } elseif ($this->cut == 3) { // 从右端裁剪 if ($proportion < 0) { $y = $this->imageinfo[1] - $height * ($this->imageinfo[0] / $width); if (imagecopyresampled($this->newimg, $this->image, 0, 0, 0, $y, $width,$height, $width * ($this->imageinfo[0] / $width), $height * ($this->imageinfo[0] / $width)) == false) { die('resize failed'); } } else { $x = $this->imageinfo[0] - $width * ($this->imageinfo[1] / $height); if (imagecopyresampled($this->newimg, $this->image, 0, 0, $x, 0, $width, $height, $width * ($this->imageinfo[1] / $height), $height * ($this->imageinfo[1] / $height)) == false) { die('resize failed'); } } } } /** * 保存图片 */ private function saveImage ($type) { eval('image'.$type.'($this->newimg,"'.$this->output.$this->newfile.'");'); imagedestroy($this->newimg); imagedestroy($this->image); } /** * 获取图片路径 */ public function getFile () { return $this->output.$this->newfile; } } $gif = new Thumb('test.png', 2000, 3000, 2); exit($gif->getFile()); ?> 特点:原图小于裁剪尺寸会将原图拉大后裁剪