php绘图添加水印,文字使用imagick库的操作

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是控制器,上方的方法都是写在其中的

相关推荐
BingoGo2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack2 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack3 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo4 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack5 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe5 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5