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

相关推荐
Bruce1231 天前
web专题之php代审(二)
php
BingoGo1 天前
PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来
后端·php
亿坊电商2 天前
物联网领域中PHP框架的最佳选择有哪些?
物联网·struts·php
wuzuyu3652 天前
用php做一个简易的路由
php·路由
老六ip加速器2 天前
手机ip隔离方法
tcp/ip·智能手机·php
rockmelodies2 天前
【PHP7内核剖析】-1.3 FPM
php
真正的醒悟2 天前
上网管理行为-ISP路由部署
服务器·php·接口隔离原则
张晓~183399481213 天前
短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
c语言·c++·人工智能·矩阵·c#·php·音视频
2zcode3 天前
基于Matlab可见光通信系统中OOK调制的误码率性能建模与分析
算法·matlab·php
rockmelodies3 天前
【PHP7内核剖析】-1.1 PHP概述
开发语言·php