PHP利用GD库实现图片合成功能方法

在程序项目开发的过程中我们免不了要实现一种功能。例如海报的生成,照片和文字合成一张新的图片。php中怎么实现
实现功能
文字和照片合成一张新的照片,并且自适应换行并加上签名和日期,加上字体样式,下面我们就开实现该功能

实现步骤简述
1.加载原始图片:使用imagecreatefromjpeg, imagecreatefrompng, 或 imagecreatefromgif等函数根据图片类型加载图片。

2.设置字体颜色、大小和样式:通过imagecolorallocate分配颜色,使用GD的内置字体或自定义字体。

3.处理文字换行:计算每行文字的宽度,以适应图片宽度进行换行处理。
在图片上绘制文字:使用imagettftext函数逐行绘制文字到图片上。

4.输出或保存合成图片:使用header设置正确的MIME类型后直接输出,或用imagejpeg, imagepng, imagegif等函数保存到文件。

// 引入GD库
if (!function_exists('imagettftext')) {
    die('GD库未安装或不支持TrueType文本');
}

// 图片路径
$imagePath = './example.jpg';
// 输出图片路径(如果需要保存)
$outputPath = './output.jpg';

// 加载图片
$im = imagecreatefromjpeg($imagePath);
list($width, $height) = getimagesize($imagePath);

// 设置文字参数
$text = "这是一段示例文字\n它包含换行\n第三行文字";
$fontColor = imagecolorallocate($im, 255, 255, 255); // 白色
$fontSize = 20;
$fontFile = './simhei.ttf'; // 确保字体文件存在

// 文字位置起始点(左上角)
$x = 10;
$y = 50;

// 处理换行
$lines = explode("\n", $text);
foreach ($lines as $line) {
    // 计算当前行的文字高度,用于垂直定位下一行
    $textBox = imagettfbbox($fontSize, 0, $fontFile, $line);
    $textWidth = max(array($textBox[2], $textBox[4])); // 获取最大宽度
    $textHeight = abs($textBox[7] - $textBox[1]); // 获取高度
    
    // 如果文字超出图片宽度,则调整字体大小或换行逻辑
    if ($textWidth > $width - 20) {
        echo "警告: 文字宽度超过图片宽度,请调整字体大小或文字内容。";
        break;
    }
    
    // 绘制文字
    imagettftext($im, $fontSize, 0, $x, $y, $fontColor, $fontFile, $line);
    $y += $textHeight + 10; // 移动到下一行
}

// 输出图片到浏览器
header('Content-Type: image/jpeg');
imagejpeg($im);

// 如果需要保存到文件
// imagejpeg($im, $outputPath);

// 释放内存
imagedestroy($im);

确保服务器已安装GD库并支持TrueType字体。
替换$fontFile变量为实际的字体文件路径,确保该字体支持中文(如simsun.ttc或simhei.ttf)。
根据实际情况调整文字位置、颜色、大小等参数。
如果文字内容动态变化且长度未知,可能需要更复杂的逻辑来处理文字换行,确保文字不会超出图片边界。

通过上述代码如果我们需要增加一个合成的内容区块那么就可以这样做例如我们要加入签名

// ... 上述代码保持不变 ...

// 文字位置起始点(左上角)
$x = 10;
$y = 50;

// 绘制主要文字内容
// ... 绘制文字的循环代码保持不变 ...

// 添加签名和时间到右下角
$signature = "签名: 作者";
$time = date("Y-m-d H:i:s"); // 获取当前时间格式化字符串
$combinedText = $signature . "\n" . $time;

// 计算签名和时间的文本框,以确定其大小
$textBox = imagettfbbox($fontSize, 0, $fontFile, $combinedText);
$textWidth = max(array($textBox[2], $textBox[4]));
$textHeight = abs($textBox[7] - $textBox[1]);

// 设置右下角的起始坐标
$x = $width - $textWidth - 10;
$y = $height - $textHeight - 10;

// 绘制签名和时间
imagettftext($im, $fontSize, 0, $x, $y, $fontColor, $fontFile, $combinedText);

// 输出图片到浏览器
header('Content-Type: image/jpeg');
imagejpeg($im);

// 保存图片到文件
imagejpeg($im, $outputPath);

echo "图片已成功保存至: " . $outputPath;

// 释放内存
imagedestroy($im);

比如我们要加入签名图片那么我们可以这么做

// ... 上述代码保持不变 ...

// 加载签名图片
$signatureImagePath = './signature.png';
$signatureIm = imagecreatefrompng($signatureImagePath);
$signatureWidth = imagesx($signatureIm);
$signatureHeight = imagesy($signatureIm);

// 计算签名图片的位置,确保在右下角
$x = $width - $signatureWidth - 10;
$y = $height - $signatureHeight - 10;

// 合并签名图片到主图片
imagecopy($im, $signatureIm, $x, $y, 0, 0, $signatureWidth, $signatureHeight);

// 销毁签名图片资源
imagedestroy($signatureIm);

// 绘制签名和时间到右下角
// ... 与之前示例中的签名和时间绘制代码保持不变 ...

// 输出图片到浏览器
header('Content-Type: image/jpeg');
imagejpeg($im);

// 保存图片到文件
imagejpeg($im, $outputPath);

echo "图片已成功保存至: " . $outputPath;

// 释放内存
imagedestroy($im);

整体就算完成了,剩下的自己研究,仅仅是一个方法,有很多可取代的方法,自行研究。学无止境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/770347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据恢复篇:5 款最佳 Mac 数据恢复软件

说到保护我们的数字生活,数据恢复软件的重要性怎么强调都不为过。无论您是意外删除了假期照片的普通用户,还是面临硬盘损坏的专业人士,随之而来的恐慌都是普遍存在的。幸运的是,数据恢复工具可以缓解这些压力。在Mac用户可用的众多…

零障碍入门:SSH免密登录与Hadoop生态系统的完美搭档【实训Day02】

一、 SSH免密登录配置 1 生成公钥和秘钥(在hadoop101上) # su star # cd /home/star/.ssh # ssh-keygen -t rsa 2 公钥和私钥 公钥id_rsa.pub 私钥id_rsa 3 将公钥拷贝到目标机器上(在hadoop101上) # ssh-copy-id hadoop101 # ssh-copy-id hadoop102 # ssh-co…

翔云发票查验接口状态码说明,哪种情况扣次数那种情况不扣次数呢

翔云发票查验API,实时联网,可以实现发票信息真伪的快速核验,帮助企业财务摆脱繁琐的发票真伪查验工作。那么知道了发票查验接口的作用,对于开发者而言,接口返回的状态码又分别代表什么含义呢?下面就翔云发票…

【Elasticsearch】Elasticsearch索引创建与管理详解

文章目录 📑引言一、Elasticsearch 索引的基础概念二、创建索引2.1 使用默认设置创建索引2.2 自定义设置创建索引2.3 创建索引并设置映射 三、索引模板3.1 创建索引模板3.2 使用索引模板创建索引 四、管理索引4.1 查看索引4.2 更新索引设置4.3 删除索引 五、索引别名…

掌握高效实用的VS调试技巧

🔥 个人主页:大耳朵土土垚 1.编程常见的错误 1.1编译型错误 编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求,如果发现错误会产生编译错误。 直接看错误提示信息(双击&#…

超声波气象站的工作原理

TH-CQX5超声波气象站中的超声波技术是其核心工作原理之一,以下是关于超声波气象站中超声波的详细解释:超声波是一种频率高于人耳能听到的声音频率范围的声波,通常指频率在20kHz以上的声波。超声波具有较短的波长和强的穿透能力,能…

相机,手机,行车记录仪及监控视频修复软件: Stellar Repair for Video

天津鸿萌科贸发展有限公司是 Stellar 系列数据恢复软件的授权代理商。 Stellar Repair for Video 是一款强大的工具,用于修复从主流相机品牌(如佳能、尼康、索尼)、行车记录仪、监控录像机、手机和其他视频设备拍摄的无法访问和损坏的视频。…

zabbix 配置企业微信告警

1、申请一个企业微信, 官网链接 2、群内申请一个机器人 下载电脑版企业微信,登录后,在要接收群消息的群里,点击右上角三个点,添加机器人后,保存机器人的webhook地址 上传应用logo,填写应用名称…

MySQL—创建和修改数据表结构

创建表 实例: CREATE TABLE user (id INT,name VARCHAR(255),password VARCHAR(255),birthday DATE) CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB; 显示数据库中的表 show tables from hsp; 显示表结构 desc dept; 修改表 实例: 代码&…

Vue85-Vuex的求和案例

一、需求 二、开发 2-1、index.js中vuex的代码 注意: 书写格式:actions中的函数名用小写!mutations中的函数名,用大写。 注意: 2-2、组件count.vue中的代码 2-3、代码优化 三、actions中的context参数 此写法的后…

网安小贴士(6)TCP/IP分层

一、前言 1983年,美国国防部决定将TCP/IP作为所有计算机网络的标准协议,这标志着TCP/IP正式成为互联网的基础协议。随着个人计算机的普及和网络技术的发展,TCP/IP模型被广泛应用于各种网络环境中,包括局域网(LAN&#…

天行健咨询|六西格玛绿带培训是投资未来,还是金钱的“黑洞”?

六西格玛绿带培训,作为一种被众多企业推崇的培训课程,自然成为了众多职场人士关注的焦点。然而,面对培训的高昂费用和时间成本,很多人开始质疑:参加六西格玛绿带培训,到底是投资还是浪费钱?深圳…

前端重点之:Vue+websocket通信详细用法和websocket心跳机制的使用,websocket断开实时监测,websocket实时通信

今年年初找工作,好多gou面试官总喜欢问关于websocket通信的使用方式,此次又用到了,在此做个总结:主要包含websocket的具体使用方法,和重点:(心跳机制的使用),就是主要是前端实时监测websocket是否有断连和数据的处理 在前端开发中,WebSocket 是一种常见的技术,用于…

安华金和—可信数据空间助力公共数据授权运营安全有序开展的实践探索

伴随数字化、网络化和智能化的快速发展,数字经济与实体经济深度融合,数据已然成为经济发展赖以依托的基础性、战略性资源,对社会生产、分配、流通、消费和社会服务管理等各环节产生深刻影响。我国高度重视数字经济发展,将数据列入…

构造函数深入理解

目录 构造函数构造函数体赋值初始化列表初始化列表格式初始化列表的意义以及注意点const修饰的成员变量初始化对象成员具体初始化的地方缺省值存在的意义例子1例子2 初始化与赋值引用成员变量的初始化注意点1注意点2我的疑惑 自定义类型成员初始化例子1例子2例子3例子4 初始化列…

Sentinel链路流控模式失效的解决方法

解决方法 1、在pom.xml中增加sentinel-web-servlet的依赖&#xff0c;我使用的版本是1.7.1 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId> </dependency>2、在项目中添加一个FilterCon…

J-Flash刷机的步骤

1、Keil编译代码&#xff0c;生成文件&#xff1a;E:\automotive\xxx.axf 2、打开"SEGGER J-Flash V7.88k"&#xff0c;配置Project information 3、点击菜单栏中的"File"&#xff0c;open data file&#xff0c;找到所需的xxx.axf文件 4、按快捷键F7进…

Yolov8模型调参大全:超详细解读每一个参数

目录 1. 代码获取方式 2. YOLOv8网络配置 3. Yolov8使用 3.1. CLI 3.2. Python 4.default.yaml文件解读 1. 代码获取方式 Yolov8项目地址&#xff1a;https://github.com/ultralytics/ultralytics 这里就不详细介绍v8了 2. YOLOv8网络配置 # Ultralytics YOLO &…

利用多模态大模型解决旅行商问题

概述 ○ 该研究论文提出了一种利用多模态大型语言模型&#xff08;MLLM&#xff09;的视觉推理能力来解决旅行商问题&#xff08;TSP&#xff09;和多旅行商问题&#xff08;mTSP&#xff09;的新方法。 ○ 传统方法依赖于节点坐标和距离矩阵&#xff0c;而本研究则采用多智能…

ueditor解决无法抓取远程背景图片问题的方法(php)

背景 laravel后台经常有用到编辑器的地方&#xff0c;Dcat使用的一般都是UEditor编辑器。最近项目经理在秀米排版以后&#xff0c;将内容复制到UEditor编辑器保存后发现&#xff0c; 在网站页面中发现图片竟然展示失败。经过浏览器控制台发现&#xff0c;图片的域名还是秀米的…