您的当前位置:首页>全部文章>文章详情

【PHP】TP使用Intervention\Image在图片上绘制矩形、文字

CrazyPanda发表于:2024-04-12 14:54:19浏览:364次TAG:

1. 在图片上绘制矩形

use Intervention\Image\ImageManagerStatic as Image;
 
public function drawRectangle()
{
    $image = Image::make('path/to/your/image.jpg'); // 替换为你的图片路径
 
    // 设置矩形的颜色和填充
    $color = '#ff0000'; // 矩形的颜色
    $alpha = 50; // 颜色的透明度 (0-100)
 
    // 设置矩形的位置和大小
    $x = 100; // 矩形左上角的x坐标
    $y = 100; // 矩形左上角的y坐标
    $width = 200; // 矩形的宽度
    $height = 100; // 矩形的高度
 
    // 绘制矩形
    $image->rectangle(
        $x, // 矩形左上角x坐标
        $y, // 矩形左上角y坐标
        $x + $width, // 矩形右下角x坐标
        $y + $height, // 矩形右下角y坐标
        $color, // 矩形颜色
        $alpha // 矩形颜色的透明度
    );
 
    // 保存修改后的图片或输出
    $image->save('path/to/save/modified_image.jpg'); // 保存到服务器
    // 或者输出到浏览器
    return $image->response('jpeg');
}


2. 在图片上绘制文本框,并输入文字

use Intervention\Image\ImageManagerStatic as Image;
 
// 初始化ImageManager
$imageManager = new Image();
 
// 读取原始图片
$image = $imageManager->make('path/to/your/image.jpg');
 
// 设置字体文件路径
$fontPath = 'path/to/your/font.ttf';
 
// 设置文本样式
$text = 'Your Text Here';
$fontSize = 20; // 字体大小
$fontColor = '#000000'; // 字体颜色
$textBoxBackground = '#FFFFFF'; // 文本框背景颜色
$padding = 10; // 文本框内边距
 
// 计算文本宽度和高度
$textBoxWidth = $fontSize * (strlen($text) + 1);
$textBoxHeight = $fontSize + $padding * 2;
 
// 绘制文本框
$x = 10; // 文本框左上角的x坐标
$y = 10; // 文本框左上角的y坐标
$image->rectangle($x, $y, $x + $textBoxWidth, $y + $textBoxHeight, function ($draw) use ($textBoxBackground) {
    $draw->background($textBoxBackground);
});
 
// 在文本框内填写文字
$image->text($text, $x + $padding, $y + $padding, function ($font) use ($fontPath, $fontSize, $fontColor) {
    $font->file($fontPath);
    $font->size($fontSize);
    $font->color($fontColor);
    $font->align('left');
    $font->valign('top');
});
 
// 保存或输出图片
$image->save('path/to/save/image.jpg');
// 或者直接输出到浏览器
// $image->response('jpg');

效果图如下

image.png

可是文字不会换行,会超出范围。


3.在图片上绘制多行文本

<?php
 
use Intervention\Image\ImageManagerStatic as Image;
 
// 初始化ImageManager
$imageManager = new Image();
 
// 加载背景图片
$background = $imageManager->make('path/to/your/background.jpg');
 
// 设置字体文件路径
$fontPath = 'path/to/your/font.ttf';
 
// 设置字体大小和颜色
$fontSize = 20;
$fontColor = '#000000';
 
// 要绘制的文本
$text = "这是第一行文本。\n这是第二行文本。\n这是第三行文本。";
 
// 计算文本的高度和宽度
$lineHeight = $fontSize + 5; // 假设行高是字体大小加5
$width = 200; // 假设的最大宽度
 
// 初始化当前绘制位置
$x = 10; // 水平位置
$y = 20; // 垂直位置
 
// 分割文本为多行
$textLines = explode("\n", $text);
 
// 开始绘制文本
foreach ($textLines as $line) {
    // 绘制单行文本
    $background->text($line, $fontPath, $x, $y, function($font) use ($fontSize, $fontColor) {
        $font->file($fontPath);
        $font->size($fontSize);
        $font->color($fontColor);
        $font->align('left');
        $font->valign('top');
    });
 
    // 更新绘制位置
    $y += $lineHeight;
}
 
// 保存或输出图片
$background->save('path/to/save/result.jpg');
 
?>

也可以自己计算文本长度,换行显示,自定义文本剪切方法:

/**
     * @param $text 文本内容
     * @param $width 总宽度
     * @param $fontsize 字体大小
     * @return array
     */
public function getTextLine($text,$width,$fontsize)
    {
        $res = [];
        $length = mb_strlen($text,'utf-8') + 1;
        if (round($length * $fontsize) <= $width)
        {
            $res[] = $text;
        }
        else
        {
            $count = round($width / $fontsize,2);
            $count  = $count < 1 ? 1 : intval($count);
            $len = 0;
            while ($len <= $length)
            {
                $res[] = mb_substr($text,$len,$count);
                $len += $count;
            }
        }

        return $res;
    }

可以达到竖排显示的效果。当然,Intervention\Image有直接竖排显示文字的方法。


4. 文本竖排显示

图片上绘制竖排显示的文字,可以使用imagettftext()函数。

use Intervention\Image\ImageManagerStatic as Image;
 
public function drawTextOnImage($imagePath, $text, $fontPath, $x, $y)
{
    // 初始化Image对象
    $image = Image::make($imagePath);
 
    // 获取图片的宽度,这里假设你想要文字垂直居中
    $width = $image->width();
 
    // 设置文字的样式和大小
    $fontSize = 20; // 字体大小
    $color = '#000000'; // 字体颜色
    $angle = 0; // 文字角度
 
    // 计算文字的高度
    $fontBox = Image::font($fontPath, $fontSize, $text, true);
    $textHeight = $fontBox->height();
 
    // 绘制文字
    $image->text($text, $x, $y, function($font) use ($fontPath, $fontSize, $color, $angle) {
        $font->file($fontPath);
        $font->size($fontSize);
        $font->color($color);
        $font->angle($angle);
    });
 
    // 返回图片资源
    return $image->response('jpg');
}
 
// 使用示例
$imagePath = 'path/to/your/image.jpg'; // 图片路径
$text = "这是竖排文字"; // 需要绘制的文字
$fontPath = 'path/to/your/font.ttf'; // 字体文件路径
$x = 0; // 文字起始点的横坐标,可以根据需要调整
$y = 50; // 文字起始点的纵坐标,可以根据需要调整
 
// 调用函数绘制文字
drawTextOnImage($imagePath, $text, $fontPath, $x, $y);


猜你喜欢

【PHP】php常见的集群有哪些
php常见的集群有LAMP集群、Nginx集群、Memcached集群、Redis集群和Hadoop集群。详细介绍:1、LAMP集群,LAMP是指Linux、Apache、MySQL和PHP的组合,是一种常见的PHP开发环境,在LAMP集群中,多个服务器运行相同的应用程序,并通过负载均衡器将请求分发到不同的服务器上;2、Nginx集群,Nginx是一种高性能的Web服务器等等。本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。PHP是一种广泛使用的服务
发表于:2023-12-06 浏览:355 TAG:
【PHP】RestFul简介和使用
1.1 RestFul简介REST全称是(Resource) Representational State Transfer,翻译过来为“资源代表状态转移”,中文意思是表述性状态转移。它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则,不是标
发表于:2024-05-24 浏览:217 TAG:
【PHP】php有哪些爬虫模块类型
hp爬虫模块类型有cURL、Simple HTML DOM、Goutte、PhantomJS、Selenium等等。详细介绍:1、cURL,可以模拟浏览器行为轻松地获取网页内容;2、Simple HTML DOM,可以通过CSS选择器或XPath表达式来定位和提取HTML元素,方便地从网页中提取所需的数据;3、Goutte可以发送HTTP请求、处理Cookie、处理表单等等。本教程操作系统:Windows10系统、PHP8.1.3版本、Dell G3电脑。PHP作为一种流行的编程语言,具有强大
发表于:2023-12-04 浏览:628 TAG:
【PHP】PHP8如何优化代码性能
PHP8的新特性和底层开发原理探索:如何优化代码性能随着互联网的迅猛发展和信息技术的不断更新,PHP作为一门重要的互联网开发语言也在不断演进。PHP8作为最新版本,带来了许多全新的特性和改进,同时也提供了更强大的底层开发能力。本文将探讨PHP8的新特性,并给出一些代码示例,展示如何优化代码性能。JIT编译器PHP8引入了Just-In-Time(即时编译)编译器。JIT编译器可以将PHP代码动态地编译成本地机器码,从而提高代码执行的效率。在PHP8中,JIT编译器默认是关闭的,需要手动启用。下面
发表于:2024-01-07 浏览:308 TAG:
【PHP】TP上传图片到OSS
准备:php版本:7.4tp版本:6.0阿里云accessKeyId;阿里云accessKeySecret;阿里云存储bucket名称,如&nbsp;examplebucket;地域节点endpoint,如:oss-cn-hangzhou.aliyuncs.com;1. 安装SDK参考官网https://help.aliyun.com/zh/oss/developer-reference/installation-13?spm=a2c4g.11186623.0.0.568f6583XllxTu
发表于:2024-03-23 浏览:393 TAG:
【PHP】PHP接入微信官方支付(native·APIv3)
一、项目介绍两个文件实现微信官方支付(native·APIv3)的发起支付和回调应答功能二、准备资料商户号:需要使用到营业执照注册商户appid:小程序或者订阅号的appidAPIv3秘钥:32位秘钥,APIv2秘钥为16位,不要混淆证书序号:apiclient_key.pem文件中的秘钥,需要将该文件改为txt后缀,然后获取其中的秘钥三、支付代码1.index.php文件&lt;?php //支付配置 $mchid&nbsp;=&nbsp;&#39;&#39;;//微信支付商户号&nbsp;P
发表于:2023-12-01 浏览:1280 TAG:
【PHP】php中实现3DES算法(ECB加密模式PKCS5Padding填充)
讲道理,一提到3DES算法,首先想到的是要和java做交互了==现在3DES已经渐渐被抛弃了,尤其是ECB加密模式使用的更少了,但是没办法,业务需要,合作方用的是他,你头再铁也不能怎样,那就扒扒文档咯网上完整的php实现以经不多了,CBC加密模式居多,所以我参考了好几篇文章,整理了一个class出来,共享上来,避免后来人踩坑感谢前人的整理总结:PHP版3DES加解密类更新成PKCS5填充模式 (http://blog.163.com/hui\_san/blog/static/5710286720
发表于:2024-01-04 浏览:293 TAG:
【PHP】php 对比2个数组是否一样
在 PHP 中,可以使用 array_diff 和 array_intersect 函数来比较两个数组是否相同。同时,还可以使用 == 或 === 运算符来比较两个数组是否相等。array_diff 函数array_diff 函数可以比较两个数组的差集,即找出在第一个数组中出现的元素,但是在第二个数组中不存在的元素。示例代码:$array1&nbsp;=&nbsp;array(1,&nbsp;2,&nbsp;3); $array2&nbsp;=&nbsp;array(1,&nbsp;3
发表于:2023-12-18 浏览:326 TAG:
【PHP】php如何去掉数组内重复元素
php去掉数组内重复元素的方法:1、使用“array_unique()”函数,去除数组中的重复数据;2、通过foreach循环遍历,通过定义一个新的数组存储不重复的数据的方法实现去重;3、使用array_flip()和array_keys()函数,可得到去重后的数组;4、使用array_filter()函数,通过使用该函数结合匿名函数的方式对原始数组进行去重。本教程操作系统:Windows10系统、PHP8.1.3版、Dell G3电脑php去除数组内重复元素的方法方法一:使用arra
发表于:2023-12-20 浏览:329 TAG:
【PHP】php审计中有哪些危险函数
php审计中危险函数有eval()函数、exec()函数、system()函数、passthru()函数、preg_replace()函数、unserialize()函数、include()和require()函数、file_get_contents()函数、unlink()函数、ysql_query()函数等等。详细介绍:1、eval()函数等等危险函数。本教程操作系统:windows10系统、PHP8.1.3版本、Dell G3电脑。在PHP审计过程中,有一些函数被认为是危险的,因
发表于:2023-12-06 浏览:334 TAG: