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

相关推荐
烤代码的吐司君18 小时前
Redis IO 多路复用原理与引入原因深度解析
数据库·redis·php
鹏易灵18 小时前
C++——8.移动语义初探(移动构造、移动赋值)
开发语言·c++·php
从零开始的代码生活_21 小时前
Linux epoll 多路转接详解
linux·运维·网络·后端·tcp/ip·计算机网络·php
不吃辣4902 天前
前端应用的离线暂停更新策略:构建稳定可靠的渐进式更新方案
开发语言·前端·php
钟智强2 天前
我警告了 329 天
git·php·wordpress·webshell
从零开始的代码生活_2 天前
Linux 五种 IO 模型详解
linux·服务器·数据库·c++·后端·php
AC赳赳老秦2 天前
防火墙规则批量配置实战:OpenClaw 自动生成模板、批量下发与合规性校验全解析
java·开发语言·人工智能·python·github·php·openclaw
2502_921286073 天前
【企业网络管理】DHCP 与 SAMBA:从协议原理到企业级实战配置全解析
开发语言·php
运维管理3 天前
H3C SecPath W2000-G[AK]系列Web应用防火墙 典型配置举例(E6711 E6712 E6713)-6W108-H3C 官方配置
服务器·网络·php