Laravel 使用 intervention/image 擴充套件包,生成帶文字的海報

laravel_peng發表於2022-05-09

上一篇是生成帶二維碼的海報,只不過海報背景圖和二維碼都是已經存在的。一般業務中二維碼是動態生成的,二維碼的生成可以通過一些擴充套件來實現,這裡不再贅述。
這一篇我們專門來講,怎麼在海報上增加新的內容,比如說:<文字資訊>

首先來介紹文字

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

  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

相關文章