<?php /** * 图片工具 * Class ImageTool */ class ImageTool { /** * 获取图片信息 * @param $filename * @return array|false */ public static function getImageSize($filename) { return getimagesize($filename); } /** * 创建空白图片资源 * @param $width * @param $height * @return false|GdImage|resource */ public static function createResource($width, $height) { return imagecreatetruecolor($width, $height); } /** * 创建图片资源 * @param $filename * @return false|GdImage|resource|null */ public static function createResourceFromFile($filename) { $imageSize = self::getImageSize($filename); switch ($imageSize['mime']) { case 'image/jpeg': $resource = imagecreatefromjpeg($filename); break; case 'image/png': $resource = imagecreatefrompng($filename); break; case 'image/gif': $resource = imagecreatefromgif($filename); break; default: $resource = null; } return $resource; } /** * 合并图片 * @param $resource * @param $addResource * @param array $options * @return mixed */ public static function merge(&$resource, $addResource, $options = []) { $options = array_merge([ 'position' => [0, 0], ], $options); imagecopy( $resource, $addResource, $options['position'][0], $options['position'][1], 0, 0, imagesx($addResource), imagesy($addResource) ); return $resource; } /** * 为图片添加文字 * @param $resource * @param string $text * @param array $options * @return mixed */ public static function text(&$resource, $text = '', $options = []) { $options = array_merge([ 'font' => __DIR__ . '/font.ttf', 'color' => [255, 255, 255], 'size' => 20, 'position' => [25, 20], ], $options); $color = call_user_func_array( 'imagecolorallocate', array_merge([$resource], $options['color']) ); $currentEncoding = mb_detect_encoding($text); if ($currentEncoding != 'UTF-8') { $text = iconv($currentEncoding, 'UTF-8', $text); } imagettftext($resource, $options['size'], 0, $options['position'][0], $options['position'][1], $color, $options['font'], $text); return $resource; } /** * 修改图片/资源大小 * @param $filename * @param $width * @param $height * @param false $crop * @return false|GdImage|resource */ public static function resize($filename, $width, $height, $crop = false) { if (is_resource($filename)) { $size = [imagesx($filename), imagesy($filename)]; $resource = $filename; } else { $size = self::getImageSize($filename); $resource = self::createResourceFromFile($filename); } // 宽高比 $resourceProp = $size[1] / $size[0]; $targetProp = $height / $width; if ($resourceProp > $targetProp) { $targetWidth = $width; $targetHeight = $width * $resourceProp; } else if ($resourceProp < $targetProp) { $targetHeight = $height; $targetWidth = $height / $resourceProp; } else { $targetWidth = $width; $targetHeight = $height; } // 创建资源 $targetResource = self::createResource($targetWidth, $targetHeight); // 缩放 imagecopyresampled($targetResource, $resource, 0, 0, 0, 0, $targetWidth, $targetHeight, $size[0], $size[1]); // 裁剪 if (true === $crop) { // 居中 $sourceX = ($targetWidth - $width) / 2; $sourceY = ($targetHeight - $height) / 2; $cropResource = self::createResource($width, $height); imagecopy($cropResource, $targetResource, 0, 0, $sourceX, $sourceY, $width, $height); return $cropResource; } return $targetResource; } /** * 图片圆角处理 * @param $resource * @param int $size */ public static function radius(&$resource, $size = 10) { $w = imagesx($resource); $h = imagesy($resource); if (empty($size)) { $radius = min($w, $h) / 2; } else { $radius = $size / 2; } $img = imagecreatetruecolor($w, $h); imagesavealpha($img, true); $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($resource, $x, $y); if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) { imagesetpixel($img, $x, $y, $rgbColor); } else { $yx = $r; $yy = $r; if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); } $yx = $w - $r; $yy = $r; if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); } $yx = $r; $yy = $h - $r; if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); } $yx = $w - $r; $yy = $h - $r; if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); } } } } $resource = $img; } /** * 保存图片 * @param $resource * @param $filename * @return bool */ public static function save($resource, $filename) { $fileNameArr = explode('.', $filename); $fileExt = strtolower(end($fileNameArr)); unset($fileNameArr); switch ($fileExt) { case 'jpg': case 'jpeg': return imagejpeg($resource, $filename); case 'png': return imagepng($resource, $filename); case 'gif': return imagegif($resource, $filename); default: } return false; } }