Laravel 使用 intervention/image 扩展包,快速生成一个带二维码的海报
准备:
- 安装 php 扩展:
imagick
。 参考链接 - 创建一个 laravel 项目。
- 安装 laravel 扩展
intervention/image
- 准备一张背景图片放置在 storage 文件夹下。
- 准备一张二维码图片放置在 storage 文件夹下。
安装命令:
- php 扩展安装
// PHP 安装扩展有一个固定的步骤。
1. 查看你的 php 已扩展列表:
php -m // 看是否存在 imagick 这个扩展。
php -m | grep imagick // 也可以管道这样查看,如果没有往下走。
1. 查看你项目使用的 php 版本:(比如常用的php版本命令)
php -v // 要注意这个命令是配置过环境变量的php命令,不代表你真实项目使用的 php 。
PHP 8.0.6 (cli) (built: May 14 2021 07:19:52) ( NTS )
2. 根据php版本下载对应可支持的扩展:
mac环境使用brew:
brew install imagemagick
mac环境不用brew(3.7.0 可以满足我当前 php8.0的使用):
http://pecl.php.net/package/imagick 下载 imagick-3.7.0.tar
win环境(3.7.0 可以满足我当前 php8.0的使用):
http://pecl.php.net/package/imagick 下载 php_imagick-3.7.0-8.0-nts-vs16-x64.zip
3. 解压扩展,扩展目录可以放置在你想要放置的任何目录:
mac: tar -xzvf imagick-3.7.0.tar
win: 直接zip解压就行
4. cd 到解压过的扩展文件夹中:
cd imagick-3.7.0
5. 通过 which 命令查看 php 的执行路径:
which phpize
/usr/local/opt/php@8.0/bin/phpize
6. 在扩展目录使用 phpize 命令:
/usr/local/opt/php@8.0/bin/phpize
7. 使用 phpconf 进行配置:
./configure --with-php-config=/usr/local/opt/php@8.0/bin/php-config
8. 安装:
make && make install
9. 检查:
make test
10. 增加对应 php.ini 文件的 extension 配置
php --ini //找到 php 配置文件(一定用你项目使用的 php 配置文件)。
/usr/local/etc/php/8.0/php.ini
extension=imagick.so
11. 关闭终端重新打开尝试 php -m 查看是否安装上 imagick 扩展。
- 安装 Laravel:
// 有项目了不用安装,没有了安装一个测试用。
composer create-project laravel/laravel example-app
- 安装 Laravel
intervention/image
扩展
composer require intervention/image
文件:
- 背景图片:
- 二维码图片:
代码:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
class CreateQrcode extends Command
{
// 执行的命令
protected $signature = 'create:qrcode';
public function handle()
{
$this->handleMergeImage(storage_path('background.png'), storage_path('qrcode.png'));
$this->info('执行完毕!');
}
/**
* 合并二维码到背景图片处理
* @param string $backgroundImg 背景图片链接
* @param string $qrImg 二维码图片链接
*/
public function handleMergeImage($backgroundImg = '', $qrImg = '')
{
// 图片文件不存在跳出。
if (!is_file($backgroundImg) || !is_file($qrImg)) {
return true;
}
// 1. Image::make($qrImg) 实例化二维码图片生成对象。
// 2. resize(width, height) 调整二维码宽高, 去适应背景图片空白处大小。
// 3. save($arImg); 保存二维码到原来路径(相当于覆盖文件), 路径自己配置。
Image::make($qrImg)->resize(1300, 1300)->save($qrImg);
// 进行图片的拼接
// 1. Image::make($backgroundImg) 实例化背景图片生成对象。
// 2. insert($qrImg, 'center', left, top) 将二维码放置背景图片中央 center,距离左边 0 像素,距离上部 450 像素,这些可根据背景图片真实大小是需要调整的。
// 3. 将拼接后的图片保存到二维码路径(相当于覆盖文件), 当然路径可以自己修改。
Image::make($backgroundImg)->insert($qrImg, 'center', 0, 450)->save($qrImg);
}
}
执行命令:
php artisan create:qrcode
执行完毕!
合成图片:
结束:
- 图片的路径必须真当前项目的绝对路径,不然会找不到图片。
- 背景图片的空白处可自己测量,来调整二维码的大小。
- 这个只是简单的单个海报的演示,真实业务可能要生成多张,循环可实现。
- 如果需要文字,进行添加到图片上。可参考Laravel的扩展文档:Intervention Image
本作品采用《CC 协议》,转载必须注明作者和本文链接
有没有更进阶的用法?
加上文字排版就完美了。
既然背景图片和二维码图片都是固定的,为什么不直接用PS把他俩合一起呢?这不是浪费资源么
留个爪,下次用到再来