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.rhkb.cn/news/367459.html

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

相关文章

【LeetCode】九、双指针算法:环形链表检测 + 救生艇

文章目录 1、双指针算法1.1 对撞双指针1.2 快慢双指针 2、leetcode141:环形链表3、leetcode881:救生艇 1、双指针算法 用两个指针来共同解决一个问题: 1.1 对撞双指针 比如先有一个有序的数组array int[] array {1, 4, 5, 7, 9}先要找两个…

小程序-<web-view>嵌套H5页面支付功能

背景:小程序未发布前,公司使用vue框架搭建了管理系统,为了减少开发成本,微信提供了web-view来帮助已有系统能在小程序上发布,详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能,导致用…

3D模型如何在力控组态中打开?---模大狮模型网

在展览3D模型设计行业中,力控组态是一个关键的技术应用。通过适当的力控组态,可以实现模型的互动性和真实感,提升展览效果和用户体验。本文将探讨如何在力控组态中打开和应用3D模型,从而达到更加生动和引人入胜的展示效果。 一、了…

WPF/C#:BusinessLayerValidation

BusinessLayerValidation介绍 BusinessLayerValidation,即业务层验证,是指在软件应用程序的业务逻辑层(Business Layer)中执行的验证过程。业务逻辑层是应用程序架构中的一个关键部分,负责处理与业务规则和逻辑相关的…

MySql Innodb 索引有哪些与详解

概述 对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B树结构,可以加速SQL查询。但对于B树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从…

俄罗斯ozon运费计算工具,跨境电商ozon物流运费计算工具

OZON平台服装类目卖家而言,如何快速、准确地为产品定价,并有效管理运费成本,直接关系到市场竞争力与利润空间。接下来我们看看俄罗斯ozon运费计算工具,跨境电商ozon物流运费计算工具。 萌啦Ozon定价工具:智能模拟&…

你想活出怎样的人生?

hi~好久不见,距离上次发文隔了有段时间了,这段时间,我是裸辞去感受了一下前端市场的水深火热,那么这次咱们不聊技术,就说一说最近这段时间的经历和一些感触吧。 先说一下自己的个人情况,目前做前端四年&am…

day62--若依框架(基础应用篇)

若依搭建 若依版本 官方 若依官方针对不同开发需求提供了多个版本的框架,每个版本都有其独特的特点和适用场景: 前后端混合版本:RuoYi结合了SpringBoot和Bootstrap的前端开发框架,适合快速构建传统的Web应用程序,其…

Unity Shader 软粒子

Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候,就需要一些粒子点缀,此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点,可以用Vertex Color与…

XML简介XML 使用教程XML的基本结构XML的使用场景

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板

前言: 大部分物料/芯片,不管MCU 还是SoC,都会有原厂提供配套开发板,有这样一个使用原型,在遇到问题时或者进行开发时可以使用。 i.MX 8QuadXPlus MEK board: 1、要测试display显示器,可使用i.MX mini SAS将“LVDS1_CH0”端口连接到LVDS到HDMI适配器的cable。 2、要测试…

微服务部署上线过程总结

目录 一、找到适合自己的部署方式 二、开始部署,先安装需要的环境 2.1 梳理一下都需要安装什么软件 2.2 配置数据库环境 2.3 配置redis 2.4 配置nacos 2.5 配置rabbitmq 2.6 配置docker环境 三、环境配置好了,开始部署后端 3.1 梳理后端都…

仓库管理系统12--供应商设置

1、添加供应商窗体 2、布局控件UI <UserControl x:Class"West.StoreMgr.View.SupplierView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://…

使用python做飞机大战

代码地址: 点击跳转

【论文阅读】伸缩密度比估计:Telescoping Density-Ratio Estimation

文章目录 一、文章概览&#xff08;一&#xff09;问题提出&#xff08;二&#xff09;文章工作 二、判别比估计和密度鸿沟问题三、伸缩密度比估计&#xff08;一&#xff09;核心思想&#xff08;二&#xff09;路标创建&#xff08;三&#xff09;桥梁构建&#xff08;四&…

Linux 生产消费者模型

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 前言 1. 生产消费者模型 1.1 什么是生产消…

每日一题——Python实现PAT乙级1005 继续(3n+1)猜想(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑概述 时间复杂度分析 空间复杂度分析 总结 我要更强 代码优化点…

Nginx详解-安装配置等

目录 一、引言 1.1 代理问题 1.2 负载均衡问题 1.3 资源优化 1.4 Nginx处理 二、Nginx概述 三、Nginx的安装 3.1 安装Nginx 3.2 Nginx的配置文件 四、Nginx的反向代理【重点】 4.1 正向代理和反向代理介绍 4.2 基于Nginx实现反向代理 4.3 关于Nginx的location路径…

Jetson系列机载电脑创建热点模式配置方法

Jetson nano为例—— 创建热点模式配置方法 1.1、新建一个 WiFi 在屏幕右上角找到网络图标&#xff0c;点击后选择“Edit Connections”选项&#xff0c;进入选择网络连接页面&#xff0c;然后点击左下角加号&#xff0c;新建一个连接&#xff0c;类型选择 WiFi 后点击 “cre…

如何选择适合自己的巴比达内网穿透方案

选择适合自己的巴比达内网穿透方案&#xff0c;需要考虑几个关键因素&#xff0c;包括您的具体需求、安全性要求、技术水平以及预算。以下是一些选择巴比达内网穿透方案的建议步骤&#xff1a; 1. 确定需求和用途 首先&#xff0c;需要明确您希望通过内网穿透实现的具体目标和…