Laravel 使用 intervention/image 扩展包,生成带文字的海报

上一篇是生成带二维码的海报,只不过海报背景图和二维码都是已经存在的。一般业务中二维码是动态生成的,二维码的生成可以通过一些扩展来实现,这里不再赘述。
这一篇我们专门来讲,怎么在海报上增加新的内容,比如说:<文字信息>

首先来介绍文字

文字本身都有哪些属性呢?例如:

  1. 文字的字体。
  2. 文字的大小。
  3. 文字的颜色。

文字相对于图片的有哪些属性呢?例如:

  1. 文字的内容。
  2. 文字的排版。
  3. 文字相对图片的位置。

其次根据上面的介绍来写对应的代码

  1. 设置文字的字体:从 可以使用的字体库 下载下来,将文件名修改为英文名字。

    // 获取字体 .ttf 文件。 
    $fontPath = storage_path('font/shoujinti.TTF');
  2. 使用添加文字的方法:文档地址 Image::text
    Laravel 使用 intervention/image 扩展包,生成带文字的海报
    Laravel 使用 intervention/image 扩展包,生成带文字的海报

  3. 实例化图片对象

    $img = Image::make('public/foo.jpg');
  4. 调用实例化对象的 text 方法。

    // 使用回调函数定义详细内容
    $textConent = "五花马千金裘,呼儿将出换美酒!!";
    $img->text($textConent, 400, 120, function($font) {
         // 设置字体文件
         $font->file(storage_path('font/shoujinti.ttf'));
    
         // 设置写入文字的颜色
         $font->color('#FFB400');    // 16进制颜色,字母需大写。
         $font->color([255, 0, 0, 1]); // 也可以 RGB 颜色。
    
         // 设置字体水平位置 - 设置相对于给定基点的水平文本对齐方式。
         // 有三个值可选,left、center、right,默认是 left
         $font->align('left');        // 用的不多,也不好用
    
         // 设置字体垂直位置 - 设置相对于给定基点的垂直文本对齐方式。
         // 有三个值可选,top、middle、buttom,默认是 buttom
         $font->valign('buttom');    // 用的不多,也不好用
    
         // 旋转字体 - 以度为单位设置文本的旋转角度。文本将围绕垂直和水平对齐点逆时针旋转。
         $font->angle(5);
    })
  5. 最终的代码。

    <?php
    namespace App\Console\Commands;
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\Storage;
    use Illuminate\Support\Str;
    use Intervention\Image\Facades\Image;
    class createPoster extends Command
    {
     /**
      * The name and signature of the console command.
      *
      * @var string
      */
     protected $signature = 'create:poster';
     /**
      * The console command description.
      *
      * @var string
      */
     protected $description = '创建海报';
     /**
      * Create a new command instance.
      *
      * @return void
      */
     public function __construct()
     {
         parent::__construct();
     }
     /**
      * 处理方法
      *
      * @return void
      */
     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;
         }
         // 生成随机字符串
         $qrRandomStr = Str::random(11);
         Storage::makeDirectory('qrcode');
         $qrcodeFileName = storage_path('app/public') . '/qrcode/' . $qrRandomStr . '.png';
    
         $posterRandomStr = Str::random(11);
         Storage::makeDirectory('poster');
         $posterFileName = storage_path('app/public') . '/poster/' . $posterRandomStr . '.png';
         // 1. Image::make($qrImg) 实例化二维码图片生成对象。
         // 2. resize(width, height) 调整二维码宽高, 去适应背景图片空白处大小。
         // 3. save($arImg); 保存二维码到原来路径(相当于覆盖文件), 路径自己配置。
         Image::make($qrImg)->resize(900, 900)->save($qrcodeFileName);
         // 进行图片的拼接
         // 1. Image::make($backgroundImg) 实例化背景图片生成对象。
         // 2. insert($qrImg, 'center', left, top) 将二维码放置背景图片中央 center,距离左边 0 像素,距离上部 450 像素,这些可根据背景图片真实大小是需要调整的。
         // 3. 将拼接后的图片保存到二维码路径(相当于覆盖文件), 当然路径可以自己修改。
         $image = Image::make($backgroundImg)->insert($qrcodeFileName, 'center', 0, 450);
    
         // 获取字体文件地址,文件地址须使用绝对地址 - 字体文件使用英文命名
         $fontPath = storage_path('thin.ttf');
         $image->text('五花马千金裘,呼儿将出换美酒!', 400, 120, function ($font) use ($fontPath) {
             $font->file($fontPath); // 字体文件地址
             $font->size(60); // 字体大小
             $font->color('#FFB400');
             // $font->color([255, 0, 0, 1]);
             $font->align('left');
             $font->valign('bottom');
             $font->angle(5);
         });
         // 将文件保存
         $image->save($posterFileName);
     }
    }

Laravel 使用 intervention/image 扩展包,生成带文字的海报

本作品采用《CC 协议》,转载必须注明作者和本文链接
Xiao Peng
本帖由系统于 30分钟前 自动加精
laravel_peng
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!