1.创建画布或者使用图片创建背景图
php
/**
* 创建或加载背景画布
*/
static function backgroundImage($backgroundImagePath = '')
{
if (!file_exists($backgroundImagePath) || !is_readable($backgroundImagePath)) {
// 下载远程图片并本地缓存
$imageData = file_get_contents($backgroundImagePath);
$path = 'uploads/qr_images/backgroundImagePath.png';
file_put_contents($path, $imageData);
$backgroundImagePath = $_SERVER['DOCUMENT_ROOT'] . '/' . $path;
}
try {
self::$canvas = new Imagick($backgroundImagePath);
} catch (\Exception $e) {
throw new \Exception("无法加载背景图: " . $e->getMessage());
}
}
2.添加文字到画布上,需要获取字体,然后就是设置了颜色和字体的位置
php
/**
* 添加文字到画布上
*/
static function text($text, $fontSize, $x, $y, $color, $statusX = '', $statusY = '')
{
$fontPath = $_SERVER['DOCUMENT_ROOT'] . '/assets/fonts/SourceHanSansK-Regular.ttf';
// 创建绘图对象
$draw = new ImagickDraw();
$draw->setFont($fontPath);
$draw->setFontSize($fontSize);
// 设置颜色
$colorStr = sprintf('rgb(%d,%d,%d)', $color[0], $color[1], $color[2]);
$draw->setFillColor(new ImagickPixel($colorStr));
// 对齐方式处理
$width = self::getTextWidth($text, $fontSize, $fontPath);
$height = self::getTextHeight($text, $fontSize, $fontPath);
switch ($statusX) {
case 'center':
$x = (self::$canvas->getImageWidth() - $width) / 2;
break;
case 'left':
$x = 0;
break;
case 'right':
$x = self::$canvas->getImageWidth() - $width;
break;
}
switch ($statusY) {
case 'center':
$y = (self::$canvas->getImageHeight() - $height) / 2 + $height;
break;
case 'top':
$y = $height;
break;
case 'bottom':
$y = self::$canvas->getImageHeight() - $height;
break;
}
// 绘制文本
self::$canvas->annotateImage($draw, $x, $y, 0, $text);
}
php
/**
* 获取文字宽度
*/
static function getTextWidth($text, $fontSize, $fontPath)
{
$draw = new ImagickDraw();
$draw->setFont($fontPath);
$draw->setFontSize($fontSize);
$metrics = self::$canvas->queryFontMetrics($draw, $text);
return $metrics['textWidth'];
}
/**
* 获取文字高度
*/
static function getTextHeight($text, $fontSize, $fontPath)
{
$draw = new ImagickDraw();
$draw->setFont($fontPath);
$draw->setFontSize($fontSize);
$metrics = self::$canvas->queryFontMetrics($draw, $text);
return $metrics['textHeight'];
}
3.添加水印,其中设置位置
php
/**
* 添加图片水印
*/
static function image($imagePath, $x, $y, $statusX = '', $statusY = '')
{
if (!file_exists($imagePath) || !is_readable($imagePath)) {
$imageData = file_get_contents($imagePath);
$path = 'uploads/qr_images/headimgurl.png';
file_put_contents($path, $imageData);
$imagePath = $_SERVER['DOCUMENT_ROOT'] . '/' . $path;
try {
$image = new Imagick($imagePath);
} catch (\Exception $e) {
throw new \Exception("无法加载水印图: " . $e->getMessage());
}
$imageWidth = $image->getImageWidth();
$imageHeight = $image->getImageHeight();
switch ($statusX) {
case 'center':
$x = (self::$canvas->getImageWidth() - $imageWidth) / 2;
break;
case 'left':
$x = 0;
break;
case 'right':
$x = self::$canvas->getImageWidth() - $imageWidth;
break;
}
switch ($statusY) {
case 'center':
$y = (self::$canvas->getImageHeight() - $imageHeight) / 2;
break;
case 'top':
$y = 0;
break;
case 'bottom':
$y = self::$canvas->getImageHeight() - $imageHeight;
break;
}
self::$canvas->compositeImage($image, Imagick::COMPOSITE_DEFAULT, $x, $y);
}
4.保存图像
php
/**
* 保存图像
*/
static function save($outPath = '')
{
$outPath = $outPath ?: 'uploads/qr_images/';
if (!file_exists($outPath)) {
mkdir($outPath, 0755, true);
}
$fileName = 'watermark_' . md5(time() . random_int(1000, 9999)) . '.png';
$filePath = $outPath . $fileName;
try {
self::$canvas->writeImage($filePath);
self::$canvas->clear();
self::$canvas->destroy();
} catch (\Exception $e) {
return Tools::set_fail("保存失败:" . $e->getMessage());
}
return $filePath;
}
5.调用绘图添加水印和文字
这里的image是控制器,上方的方法都是写在其中的