mirror of https://gitee.com/topnuomi/water-mask
186 lines
5.0 KiB
PHP
186 lines
5.0 KiB
PHP
<?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],
|
|
'pct' => 100,
|
|
], $options);
|
|
imagecopymerge(
|
|
$resource,
|
|
$addResource,
|
|
$options['position'][0],
|
|
$options['position'][1],
|
|
0,
|
|
0,
|
|
imagesx($addResource),
|
|
imagesy($addResource),
|
|
$options['pct']
|
|
);
|
|
|
|
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 $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;
|
|
}
|
|
}
|