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

相关推荐
爱和冰阔落5 小时前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php
eggwyw5 小时前
PHP8.5怎么用ffmpeg提取视频里的字幕轨道
开发语言·php
我叫黑大帅19 小时前
PHP 常驻 Worker 中 MySQL 连接中断问题报告
后端·面试·php
国科安芯21 小时前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
码途行者1 天前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
老秦包你会1 天前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
迪康coolmu2 天前
出差终端数据安全落地实战:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·经验分享·笔记·其他·安全·php
普通人62 天前
PHP文件读写完全指南
开发语言·php·1024程序员节
vipxieliang2 天前
ThinkORM 3.0 入门:强类型模型定义与查询构造器
后端·php·thinkphp
vipxieliang2 天前
PHP 密码哈希与 password_hash 最佳实践
后端·php