123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- <?php namespace Image\Lib\Tool;
- use Dever;
- class Gd extends Core
- {
- # 缩放
- public function thumb($set)
- {
- if (!$this->im) {
- return false;
- }
- $result = array();
- if (!is_array($set)) {
- $set = explode(',', $set);
- }
- $source_x = imagesx($this->im);
- $source_y = imagesy($this->im);
- $source_w = $source_x/$source_y;
- $source_h = $source_y/$source_x;
- foreach ($set as $k => $v) {
- $result[$k] = $this->getDest($v . '_thumb');
- if ($this->check($result[$k])) {
- list($dest_x, $dest_y, $offset) = $this->getXy($v, $source_x, $source_y, $source_w, $source_h);
- $im = $this->copy($this->im, $dest_x, $dest_y, $source_x, $source_y, 0, 0, false, 1);
- imagejpeg($im, $result[$k]);
- $this->destroy($im);
- }
- }
- return $result;
- }
- # 裁剪
- public function crop($set, $position)
- {
- if (!$this->im) {
- return false;
- }
- $result = array();
- if (!is_array($set)) {
- $set = explode(',', $set);
- }
- $source_x = imagesx($this->im);
- $source_y = imagesy($this->im);
- foreach ($set as $k => $v) {
- $result[$k] = $this->getDest($v . '_crop');
- if ($this->check($result[$k])) {
- $x = 0;
- $y = 0;
- $offset = explode('_', $v);
- if (isset($offset[2]) && $offset[2]) {
- $offset[0] += $offset[2];
- $offset[1] += $offset[2];
- }
- if ($position) {
- if (!is_array($position)) {
- list($x, $y) = $this->position($source_x, $source_y, $offset[0], $offset[1], $position);
- } else {
- # 加入根据百分比计算裁图
- if ($position[0] <= 0) {
- $position[0] = $source_x/2 - $offset[0]/2;
- } elseif (strstr($position[0], '%')) {
- $position[0] = $source_x * intval(str_replace('%', '', $position[0]))/100;
- }
- if ($position[1] <= 0) {
- $position[1] = $source_y/2 - $offset[1]/2;
- } elseif (strstr($position[1], '%')) {
- $position[1] = $source_y * intval(str_replace('%', '', $position[1]))/100;
- }
- $x = $position[0];
- $y = $position[1];
- }
- } else {
- $x = $source_x/2 - $offset[0]/2;
- $y = $source_y/2 - $offset[1]/2;
- }
- if ($x < 0) {
- $x = 0;
- }
- if ($y < 0) {
- $y = 0;
- }
- $im = $this->copy($this->im, $offset[0], $offset[1], $offset[0], $offset[1], $x, $y);
- imagejpeg($im, $result[$k]);
- $this->destroy($im);
- }
- }
- return $result;
- }
- # 图片水印
- public function pic($water, $position = 5, $offset = 0, $width = 0, $height = 0, $radius = 0)
- {
- if (!$this->im) {
- return false;
- }
- $result = $this->getDest('mark');
- if ($this->check($result)) {
- if ($radius) {
- $water = $this->get_radius($water, $radius);
- } else {
- $water = $this->get($water);
- }
- $source_x = imagesx($this->im);
- $source_y = imagesy($this->im);
- $water_x = imagesx($water);
- $water_y = imagesy($water);
- if ($width || $height) {
- $water_w = $water_x/$water_y;
- $water_h = $water_y/$water_x;
- if ($water_x > $width) {
- $dest_x = $width;
- $dest_y = $width*$water_h;
- } elseif ($height > 0 && $water_y > $height) {
- $dest_x = $height*$water_w;
- $dest_y = $height;
- } else {
- $dest_x = $water_x;
- $dest_y = $water_y;
- }
- $water = $this->copy($water, $dest_x, $dest_y, $water_x, $water_y, 0, 0, false, 2);
- $xy = $this->position($source_x, $source_y, $dest_x, $dest_y, $position, $offset);
- $water_x = $dest_x;
- $water_y = $dest_y;
- } else {
- $xy = $this->position($source_x, $source_y, $water_x, $water_y, $position, $offset);
- }
- if ($xy[0] == -1) {
- # 水印平铺 gd的先不做了
- $xy[0] = $xy[1] = 0;
- }
- if ($xy[2] == false) {
- $this->destroy($water);
- return;
- }
- $im = $this->copy($water, $water_x, $water_y, 0, 0, $xy[0], $xy[1], $this->im);
- imagejpeg($im, $result);
- $this->destroy($water);
- }
- return $result;
- }
- # 文字水印
- public function txt($name, $position = 5, $offset = 0, $size = 10, $color = '', $angle = 0, $width = 0, $font = 'SIMSUN.TTC')
- {
- if (!$this->im) {
- return false;
- }
- $result = $this->getDest('txt');
- if ($this->check($result)) {
- $autowrap = 0;
- if ($width > 0) {
- $name = $this->autowrap($autowrap, $size, $angle, $font, $name, $width);
- }
- $position = imagettfbbox($size, $angle, $font, $name);
- if ($position) {
- $source_x = imagesx($this->im);
- $source_y = imagesy($this->im);
- $water_x = $position[2] - $position[0];
- $water_y = $position[1] - $position[7];
- $xy = $this->position($source_x, $source_y, $water_x, $water_y, $position, $offset);
- }
- if ($color && (strlen($color)==7)) {
- $left = $xy[0] ?? 0;
- $top = $xy[1] ?? 0;
- $R = hexdec(substr($color,1,2));
- $G = hexdec(substr($color,3,2));
- $B = hexdec(substr($color,5));
- putenv('GDFONTPATH=' . realpath('.'));
- imagettftext($this->im, $size, $angle, $left, $top + $autowrap, imagecolorallocate($this->im, $R, $G, $B), $font, $name);
- }
- imagejpeg($this->im, $result);
- }
- return $result;
- }
- protected function copy($im, $w, $h, $x, $y, $l, $t, $dim = false, $ti = 1)
- {
- if ($dim == false) {
- $dim = $this->create($w, $h, $ti);
- imagecopyresized($dim, $im, 0, 0, $l, $t, $w, $h, $x, $y);
- } else {
- imagecopy($dim, $im, $l, $t, 0, 0, $w, $h);
- //imagecopyresampled($dim, $im, $l,$t, 0, 0, $w, $h, $x, $y);
- }
- return $dim;
- }
- protected function create($w, $h, $t = 1)
- {
- $im = imagecreatetruecolor($w,$h);
- if ($t == 1) {
- # 空白背景
- $wite = ImageColorAllocate($im, 255,255,255);
- imagefilledrectangle($im, 0, 0, $w, $h, $wite);
- imagefilledrectangle($im, $w, $h, 0,0, $wite);
- ImageColorTransparent($im, $wite);
- } elseif ($t == 2) {
- # 透明背景
- imagealphablending($im, false);
- imagesavealpha($im,true);
- $transparent = imagecolorallocatealpha($im, 255, 255, 255, 127);
- imagefilledrectangle($im, 0, 0, $w, $h, $transparent);
- }
- return $im;
- }
- protected function get($im)
- {
- $im = file_get_contents($im);
- $im = imagecreatefromstring($im);
- return $im;
- }
- # 圆角图片
- private function get_radius($imgpath = '', $radius = 0)
- {
- $ext = pathinfo($imgpath);
- $src_img = null;
- switch ($ext['extension']) {
- case 'jpg':
- $src_img = imagecreatefromjpeg($imgpath);
- break;
- case 'png':
- $src_img = imagecreatefrompng($imgpath);
- break;
- }
- $wh = getimagesize($imgpath);
- $w = $wh[0];
- $h = $wh[1];
- $radius = $radius <= 0 ? (min($w, $h) / 2) : $radius;
- $img = imagecreatetruecolor($w, $h);
- //这一句一定要有
- imagesavealpha($img, true);
- //拾取一个完全透明的颜色,最后一个参数127为全透明
- $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
- imagefill($img, 0, 0, $bg);
- $r = $radius; //圆 角半径
- for ($x = 0; $x < $w; $x++) {
- for ($y = 0; $y < $h; $y++) {
- $rgbColor = imagecolorat($src_img, $x, $y);
- if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) {
- //不在四角的范围内,直接画
- imagesetpixel($img, $x, $y, $rgbColor);
- } else {
- //在四角的范围内选择画
- //上左
- $y_x = $r; //圆心X坐标
- $y_y = $r; //圆心Y坐标
- if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
- imagesetpixel($img, $x, $y, $rgbColor);
- }
- //上右
- $y_x = $w - $r; //圆心X坐标
- $y_y = $r; //圆心Y坐标
- if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
- imagesetpixel($img, $x, $y, $rgbColor);
- }
- //下左
- $y_x = $r; //圆心X坐标
- $y_y = $h - $r; //圆心Y坐标
- if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
- imagesetpixel($img, $x, $y, $rgbColor);
- }
- //下右
- $y_x = $w - $r; //圆心X坐标
- $y_y = $h - $r; //圆心Y坐标
- if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
- imagesetpixel($img, $x, $y, $rgbColor);
- }
- }
- }
- }
- return $img;
- }
- protected function _destroy()
- {
- imagedestroy($this->im);
- $this->im = false;
- }
- }
|