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.mzph.cn/diannao/39763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Seal^_^【送书活动第8期】——《ChatGLM3大模型本地化部署、应用开发与微调》

Seal^_^【送书活动第8期】——《ChatGLM3大模型本地化部署、应用开发与微调》 一、参与方式二、本期推荐图书2.1 作者建语2.2 编辑推建2.3 图书简介2.4 前 言2.5 目 录 三、正版购买 大模型领域 既是繁星点点的未知宇宙,也是蕴含无数可能的广阔天地, 正…

深入理解 Linux 内核架构

目录 引言内核概念Linux 内核的基本组成 进程管理内存管理文件系统设备驱动网络栈内核结构 内核态与用户态内核模块系统调用中断与异常处理内核同步机制Linux 内核使用场景常用的内核命令与工具内核调试与性能优化总结 1. 引言 Linux 内核是现代计算机系统的核心组件之一&am…

python--基础知识点--协程

协程由用户态控制,不由内核控制1个线程中可以开很多协程协程切换是在用户态控制不由内核控制,切换时资源开销小使用方式:async def、await可等待对象(协程对象、Future对象、task对象(是Future对象的子类)->io等待)、事件循环使用场景&…

idea创建自定义的maven spark scala archetype脚手架

一:先创建一个Maven项目net.alchim31.maven(选该模板,得要等一会儿才能加载出来) 之后将自己的目录结构建立好,最好不要有空目录,可能会因为没有文件在install的时候编译不进去 pom中内容也按照自己的需要改…

Stable Diffusion web UI 插件

2024.7.3更新,持续更新中 如果需要在linux上自己安装sd,参考:stable diffusion linux安装 插件复制到 /stable-diffusion-webui/extensions 目录下,然后重新启动sd即可 一、插件安装方法 每种插件的安装方法可能略有不同&#xf…

苹果p12证书最简单最新申请流程

使用uniapp打包,在ios上打正式包需要苹果的p12证书和证书profile文件,点进去uniapp的ios证书申请教程,通篇就是使用mac电脑申请的教程,假如没有mac电脑就无法继续了。 因此,假如没有mac电脑的同志们,可以参…

高薪程序员必修课-Java中为什么不建议使用Executors来创建线程池?

目录 前言 原因分析 1. newFixedThreadPool 和 newSingleThreadExecutor 示例: 2. newCachedThreadPool 示例: 建议的替代方法 示例: 解释: 总结 前言 在Java中,Executors 类提供了几个工厂方法来创建不同类型…

RAG开源项目Qanything源码阅读3-在线推理

原文:前沿重器[47] | RAG开源项目Qanything源码阅读3-在线推理 项目:https://github.com/netease-youdao/QAnything 第一篇:RAG开源项目Qanything源码阅读1-概述服务 第二篇:RAG开源项目Qanything源码阅读2-离线文件处理 0&#x…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(五)Jenkins配置

一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …

中英双语介绍美国的州:路易斯安那州(Louisiana)

中文版 路易斯安那州简介 路易斯安那州位于美国南部,以其丰富的历史文化、多样的自然景观和独特的音乐和美食传统而闻名。以下是对路易斯安那州的详细介绍,包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 路易斯安那州东临密西西比州…

鸿蒙应用开发-时间屏幕

点击下载源码: https://download.csdn.net/download/liuhaikang/89509449 做一个时间屏幕,可以点击切换白色和黑色,有渐变效果,使用到了鸿蒙的动画效果。 在这个设计中,我们首先引入了通用能力包,以实现功…

Kubernetes 离线安装的坑我采了

Kubernetes 离线安装的坑我采了 一、Error from server: Get "https://xx.xx.xx.xx:10250/containerLogs/kube-system/calico-node-8dnvs/calico-node": tls: failed to verify certificate: x509: certificate signed by unknown authority二、calico 或 pod 启动正…

cesium公交车轨迹漫游

个人博客:CSDN 博客-满分观察网友 z 演示地址:哔哩哔哩-满分观察网友 z 这是一个用 Cesium.js 做的公交车轨迹漫游,实现的功能有加载站点和道路轨迹点数据、监听车辆的实时位置、车辆控制器。滚动屏等等。 文章目录 1. 地图初始化2. 数据渲…

【高中数学/基本不等式】已知:x,y均为正实数,且xy+2x+y=4 求:x+y的最小值?

【问题】 已知:x,y均为正实数,且xy2xy4 求:xy的最小值? 【来源】 https://www.ixigua.com/7147585275823292942?logTagf25494de7fce23a3a3d0 【解答】 解: 由xy2xy4 两边加二得 xy2xy24 2 分解因式得 (x1)(…

0090__【Git系列】merge和rebase的区别

【Git系列】merge和rebase的区别_rebase和merge的区别-CSDN博客 git中rebase和merge的区别是什么-git-PHP中文网 https://blog.51cto.com/qzcsbj/9444199

从零搭建教育管理系统:Java + Vue.js 教学-02

第三步:创建实体类和 Mapper 接口 现在我们已经设计好了数据库表,接下来使用 MyBatis-Plus 将这些表映射到 Java 对象,以便在代码中轻松地进行操作。 1. 创建实体类 在 src/main/java/<your_package>/entity 目录下 (如果没有该目录,请手动创建),创建与数据库表对应…

MyBatis(20)MyBatis 事务管理如何实现

MyBatis 的事务管理是通过底层 JDBC 连接的事务管理机制来实现的。事务管理对于任何涉及多个数据库操作的应用程序来说都是至关重要的&#xff0c;它确保数据的一致性和完整性。在 MyBatis 中&#xff0c;事务管理可以通过 SQL 会话&#xff08;SqlSession&#xff09;来实现。…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第53课-语音指令跳舞

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第53课-语音指令跳舞 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

可信计算的完整专用名词列表

可信计算的完整专用名词列表 Trusted Computing - 可信计算Trusted Platform Module (TPM) - 可信平台模块Hardware Root of Trust - 硬件根信任Secure Boot - 安全启动Remote Attestation - 远程证明Integrity Measurement - 完整性度量Measurement Log - 度量日志Attestatio…

Android 图像效果的奥秘

在当今数字化时代&#xff0c;图像已经成为人们生活和工作中不可或缺的一部分。而在 Android 系统中&#xff0c;图像效果的应用更是丰富多彩&#xff0c;为用户带来了更加出色的视觉体验。本文将深入探讨 Android 图像效果的原理、实现方法以及应用场景&#xff0c;帮助读者更…