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

【PHP】生成二维码海报

CrazyPanda发表于:2023-12-02 23:24:45浏览:778次TAG:

目录

1.版本

2.安装扩展

3.生成海报

4.代码解释

5.附一个字体文件 

6.参考文档



1.版本


  • php:7.2+ ,本示例使用的是7.3

  • endroid/qr-code :4.* ,本示例使用的是4.3

  • intervention/image:2.* ,本示例使用的是2.7

  • 使用前检查下是否启用了 gd2 扩展

2.安装扩展


composer require endroid/qr-code

composer require intervention/image

3.生成海报

<? php
 
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Logo\Logo;
use Intervention\Image\ImageManager;
 
// 背景图
$backgroundImagePath = './uploads/qrcode/bg.png';
// 二维码内容
$qrCodeContent = 'https://www.example.com';
// 合成后的图片保存路径
$outputPath = 'uploads/qrcode/poster.png';
 
$qrCode = QrCode::create($qrCodeContent)
    // 内容编码
    ->setEncoding(new Encoding('UTF-8'))
    // 内容区域大小
    ->setSize(260)
    // 内容区域外边距
    ->setMargin(10)
    // 内容圆形块尺寸模型
    ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
    // 内容颜色
    ->setForegroundColor(new Color(0, 0, 0))
    // 背景颜色
    ->setBackgroundColor(new Color(255, 255, 255));
 
// 二维码logo
$logo = 'logo.png';
$logo = Logo::create($logo)->setResizeToWidth(50);
 
// 生成二维码数据对象(后面两个参数都是可选的)
$result = (new PngWriter)->write($qrCode, $logo);
 
// 将二维码图片保存到本地服务器
// $result->saveToFile($outputPath);
// 或 file_put_contents($outputPath, $result->getString());
 
// 返回 base64 格式的图片,这里的图片可以直接显示在接口工具中
// $dataUri = $result->getDataUri();
// echo "<img src='{$dataUri}'>";
 
// 生成ImageManager对象
$imageManager = new ImageManager(['driver' => 'gd']);
// 创建二维码图像资源
$qrCodeImage = $imageManager->make($result->getString());
// 创建背景图资源
$backgroundImage = $imageManager->make($backgroundImagePath)->resize(750, 1334);
 
// 将文本写入图像 - 邀请码
$text = '我的邀请码:362260';
// $text:要写入图像的文本字符串
// $x:文本左下角的 X 坐标
// $y:文本左下角的 Y 坐标
// $font:一个回调函数,用于设置文本的样式(可选)
$backgroundImage - > text($text, 370, 1100, function($font) {
    // 使用字体文件
    $font->file(ROOT_PATH.'public/assets/fonts/YaHeiConsolasHybrid.ttf');
    // 设置字体大小
    $font->size(30);
    // 设置文本颜色
    $font->color('#333333');
    // 设置文本居中对齐
    $font->align('center');
    // 设置文本顶部对齐
    $font->valign('top');
    // 设置文本旋转()度
    $font->angle(0);
});
 
// 将二维码合成到背景图上
$backgroundImage->insert($qrCodeImage, 'top-left', 230, 800);
 
// 保存合成后的图片,还可以根据需求上传到云存储上面
$backgroundImage->save($outputPath);
 
var_export($outputPath);

4.代码解释


这段代码是一个生成二维码并将其与背景图合成的示例。它使用了 Endroid\QrCode\QrCode 类来生成二维码,Endroid\QrCode\Writer\PngWriter 类来写入二维码到文件,以及 Intervention\Image\ImageManager 类来处理图像。

 

以下是代码的主要步骤:

 
  1. 背景图

    • 指定背景图的路径 $backgroundImagePath

    • 使用 Intervention\Image\ImageManager 创建一个 ImageManager 对象,并使用它的 make 方法加载背景图。

    • 使用 resize 方法调整背景图的大小为 750x1334。

  2. 二维码内容

    • 指定二维码的内容 $qrCodeContent

    • 使用 QrCode::create 方法创建一个二维码对象,并传入内容。

    • 设置二维码的编码方式为 UTF-8。

    • 设置二维码的大小为 260。

    • 设置二维码的外边距为 10。

    • 设置二维码的圆形块尺寸模型为 RoundBlockSizeModeMargin

    • 设置二维码的前景色为黑色,背景色为白色。

  3. 二维码 logo

    • 指定二维码 logo 的路径 $logo

    • 使用 Logo::create 方法创建一个 logo 对象,并传入 logo 的路径。

    • 设置 logo 的宽度为 50。

  4. 生成二维码数据对象

    • 使用 new PngWriter 创建一个 PngWriter 对象。

    • 使用 write 方法将二维码对象和 logo 对象写入到数据对象中。

  5. 将二维码图片保存到本地服务器

    • 使用 saveToFile 方法将二维码数据对象保存到本地服务器的临时文件中。

  6. 返回 base64 格式的图片

    • 使用 getDataUri 方法将二维码图片的 base64 格式返回。

  7. 保存二维码到临时文件

    • 使用 file_put_contents 函数将二维码数据对象写入到临时文件中。

  8. 加载背景图和二维码图

    • 使用 ImageManager 创建一个图像管理对象,并使用它的 make 方法加载背景图和二维码图。

  9. 将文本写入图像 - 邀请码

    • 指定要写入图像的文本 $text 和文本的位置坐标。

    • 使用 text 方法将文本写入图像。

  10. 将二维码合成到背景图上

    • 使用 insert 方法将二维码合成到背景图上,并指定合成的位置。

  11. 保存合成后的图片

    • 使用 save 方法保存合成后的图片到指定路径 $outputPath

  12. 删除临时文件

    • 使用 unlink 函数删除临时文件。

  13. 输出合成后的图片路径

    • 使用 var_export 函数输出合成后的图片路径。

 

请注意,此示例代码需要在服务器环境中运行,因为它涉及到文件操作。如果在本地环境中运行,可能需要适当修改文件路径和权限。此外,确保你的服务器环境支持 GD 或 Imagick 扩展,以便能够处理图像操作。

5.附一个字体文件 


文件地址:YaHei-Consolas-Hybrid-1.12: YaHei Consolas Hybrid 字体

6.参考文档


猜你喜欢

【PHP】php逻辑测试,测试也要设计—phpunit实践
概述本文阐述如何利用面向对象的思想,在phpunit框架下实现测试用例、数据文件、配置信息和lib库等信息分离,并能有效组合。也许有些QA认为,测试代码只要能满足测试要求即可,根本不需要有什么设计的理念。其实不然,好的测试代码,应该是可读性强,可扩展性强。以下分享一个我在实际项目中的小想法来阐述这个观点,仅作抛砖引玉之用。具体实现在autoFunc测试目录下,创建conf、data、lib三个目录,分别用于保存配置信息、数据文件和lib库,测试用例直接放在autoFunc下。A 方案直接在tes
发表于:2024-06-22 浏览:266 TAG: #php #测试
【PHP】Permission denied怎么解决
Permission denied的解决方法:1、确保当前用户具有足够的权限来执行该操作;2、如果当前用户没有足够的权限,可以尝试更改文件或目录的权限;3、如果当前用户不是管理员或没有足够的权限,可以尝试使用管理员权限来执行操作;4、可以尝试更改文件系统属性,以便允许写入操作;5、可以尝试释放磁盘空间,以便有足够的空间来执行操作;6、检查文件是否被其他进程占用。当我们遇到Permission denied这样的错误提示时,这通常意味着我们没有足够的权限来执行某个操作。解决Permiss
发表于:2023-12-06 浏览:366 TAG:
【PHP】php有哪些不可替代性
php不可替代的原因有跨平台性、广泛的社区支持、丰富的功能和库、良好的性能和可扩展性以及广泛的应用领域,都是不可替代的。详细介绍:1、跨平台性,PHP可以运行在几乎所有的操作系统上,包括Windows、Linux、Mac OS等,这使得开发人员可以在不同的平台上使用相同的代码进行开发和测试;2、广泛的社区支持,这个社区提供了大量的教程、文档和开源项目;3、丰富的功能和库等等。本教程操作系统:windows10系统、PHP8.1.3版本、Dell G3电脑。PHP是一种广泛使用的服务器端
发表于:2023-12-06 浏览:392 TAG:
【PHP】php8和php7哪个好
PHP8相较于PHP7在性能、新特性和语法改进、类型系统、错误处理和扩展等方面都有一些优势和改进。然而,选择使用哪个版本要根据具体的需求和项目情况来决定。详细介绍:1、性能提升,PHP8引入了Just-in-Time(JIT)编译器,可以提高代码的执行速度;2、新特性和语法改进,PHP8支持命名参数和可选参数的声明,使得函数调用更加灵活;引入了匿名类、属性的类型声明等等。【程序员必备开发工具推荐】Apifox一款免费API管理工具Apifox = Postman + Swagger +
发表于:2023-12-04 浏览:607 TAG:
【PHP】php怎么将json格式化输出
在PHP中,我们可以使用json_encode()函数将数据转换为JSON格式。而要格式化输出JSON数据,可以使用json_encode()函数的第三个参数传递JSON_PRETTY_PRINT常量。下面是在PHP中将JSON格式化输出的具体步骤:1. 创建一个包含数据的数组或对象:“`php$data = array(&nbsp; &nbsp; ‘name’ =&gt; ‘John’,&nbsp; &nbsp; ‘age’ =&gt; 30,&nbsp; &nbsp; ‘city’ =&amp;gt
发表于:2024-08-02 浏览:305 TAG:
【PHP】PHP中使用ElasticSearch
在es中,使用组合条件查询是其作为搜索引擎检索数据的一个强大之处,在前几篇中,简单演示了es的查询语法,但基本的增删改查功能并不能很好的满足复杂的查询场景,比如说我们期望像mysql那样做到拼接复杂的条件进行查询该如何做呢?es中有一种语法叫bool,通过在bool里面拼接es特定的语法可以做到大部分场景下复杂条件的拼接查询,也叫复合查询首先简单介绍es中常用的组合查询用到的关键词,filter:过滤,不参与打分 must:如果有多个条件,这些条件都必须满足 and与 should:如果有多个条
发表于:2024-07-26 浏览:258 TAG: #php #Elasticsearch
【PHP】php如何将utf8转gbk编码
随着互联网的发展,跨语言交流和国际化成为了越来越普遍的需求。由于不同的编码方式,网站之间的数据传输和处理也变得越来越复杂。在这个过程中,一些老旧的编码方式依然在使用,比如GBK编码。为了兼容各种编码方式,php提供了一些内置函数来进行编码转换,本文将介绍如何将utf8编码转换成GBK编码。一、了解编码首先,我们需要了解utf8和GBK编码分别是什么。utf8是一种可变长度的字符编码,是国际标准化组织ISO的一部分,也是Unicode字符集的一种实现方式。utf8编码可以容纳所有Unic
发表于:2023-12-20 浏览:327 TAG:
【PHP】PHP获取器和修改器技巧
从入门到精通:掌握PHP中的获取器和修改器技巧在PHP编程中,获取器(Getter)和修改器(Setter)是非常重要的概念和技巧。它们被广泛应用于面向对象编程中,用于实现封装性和数据安全性。本文将介绍获取器和修改器的概念、作用以及具体的代码示例,帮助读者掌握PHP中获取器和修改器的技能,从入门到精通。一、获取器(Getter)和修改器(Setter)的基本概念和作用获取器和修改器是一对用于访问和修改对象属性的方法,主要用于保护属性的访问权限和数据的完整性。获取器用于获取对象的属性值,
发表于:2023-12-27 浏览:426 TAG:
【PHP】PHP8.1新特性大讲解之Enums枚举
PHP 8.1:枚举它们终于来了——PHP 8.1中将添加对枚举的内置支持!有些人可能认为他们早就应该这样做了,但你没有听到我的抱怨;我很高兴他们做到了!这篇文章致力于深入研究新添加的功能。像往常一样,在我的 PHP 功能帖子中,我们首先对枚举的外观进行高级概述:enum&nbsp;Status { &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;DRAFT; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;PUBLISHED; &nbsp;&nbsp;&amp;
发表于:2024-01-03 浏览:461 TAG:
【PHP】php哪些函数可以用来去幂方值
php可以用来去幂方值的函数有pow函数、双星号、exp函数、sqrt函数和log函数等。详细介绍:1、pow函数用于计算x的y次幂,x是底数,y是指数;2、双星号是幂运算符,用于计算一个数的幂;3、exp函数用于计算以e为底的x次幂,e是自然对数的底数,x是指数;4、sqrt函数用于计算一个数的平方根,x是计算平方根的数;5、log函数用于计算以指定底数为底的对数。本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。在PHP中,可以使用一些内置的函数来
发表于:2023-12-28 浏览:255 TAG: