Laravelを使って画像生成したい(文章を追加した画像生成)ときの流れを解説します。導入するまでに、数々のerrorを対処してきたので記録して残したいと思います。
ライブラリの導入は正しく把握していないと苦労が多いですね…!!
環境:
Laravel 7
dokcer
docker-compose
必要な要素:
1:intervention/imageのインストール
2:開発環境へGDのインストール
3: intervention/image で画像を生成
4: intervention/image で画像 に文字を描画する
こちらの流れです。
1:intervention/imageのインストール
まずは、ライブラリのインストールです。
composerでインストールしていきます。
composer require intervention/image
intervention/imageをファザードで活用するために設定を追加していきます。
> config/app.php
の中に2か所追加していきます。
'providers' => [ // 省略 Intervention\Image\ImageServiceProvider::class ] 'aliases' => [ // 省略 'Image' => Intervention\Image\Facades\Image::class ]
これにて基本の設定は完了です。
しかし、これだけで使用してみようとすると、errorがでます。
たとえば、
簡単に intervention/image を使うように下記を実行してみてください。
use Intervention\Image\Facades\Image; //省略 public function imagerotate() { $path = storage_path('app/public/profile/profiledefault.png'); $img = Image::make($path); $img->rotate(-45); $save_path = storage_path('app/public/profile/profiledefault222.png'); $img->save($save_path); }
storage>app/public/profile/ フォルダを作成して、その中にprofiledefault.png を格納
これだと、下記のようなエラーがでると思います。
(正しくGDがインストールされている場合は問題ないです。)
GD Library extension not available with this PHP installation.
intervention/image を使うには、GDというライブラリも必要だということですね。
2:開発環境へGDのインストール
それでは、GDを開発環境にインストールしていきます。
dockerを使っているので、そちらへインストールしていきます。
RUN apt-get install -y zlib1g-dev \ libzip-dev \ libjpeg-dev \ libpng-dev \ libfreetype6-dev \ libjpeg62-turbo-dev RUN docker-php-ext-configure \ gd --with-freetype-dir=/usr/include --with-png-dir=/usr/include --with-jpeg-dir=/usr/include RUN docker-php-ext-install pdo_mysql zip gd
関係している部分のみ記述しています。
RUN docker-php-ext-install でgdをインストールしているのですが、
gdをインストールするために
・RUN apt-get install
・RUN docker-php-ext-configure
を使って必要なものを準備しています。
--with-freetype-dir=/usr/include
こちらが無くても、画像の処理は可能です。
ただし、これが無いと画像に文字を描画することができません。
正しく動いたdockerfileのみ記述しましたが、こちらを整えるまでに幾つかのerrorがありました….
configure: error: jpeglib.h not found. ERROR: Service 'php' failed to build: The command '/bin/sh -c docker-php-ext-configure gd --with-png-dir=/usr/include --with-jpeg-dir=/usr/include' returned a non-zero code: 1
errorの原因と対処法 ↓ ↓ ↓ ↓
Call to undefined function Intervention\Image\Gd\imagettfbbox()
errorの原因と対処法 ↓ ↓ ↓ ↓
それぞれ個別にerrorの原因と対処法を記述しましたので、そちらも参考にしてみ下さい。
3: intervention/image で画像を生成
ここまでくれば、画像を生成することができると思います。
前述した、下記を実行して確認してみてください。
use Intervention\Image\Facades\Image; //省略 public function imagerotate() { $path = storage_path('app/public/profile/profiledefault.png'); $img = Image::make($path); $img->rotate(-45); $save_path = storage_path('app/public/profile/profiledefault222.png'); $img->save($save_path); } // storage>app/public/profile/ フォルダを作成して、その中にprofiledefault.png を格納
4: intervention/image で画像 に文字を描画する
いよいよ最後です。
画像に文字を描画していきます。
文字を描画する方法は、下記です。
canvasの作り方は他にもあります。例えば、既存の画像を使用することも可能です。
$x = 40; $y = 20; $img = Image::canvas(120, 60, '#fff'); $img->text('こんにちわ!', $x, $y, function($font){ $font->file('assets\fonts\SawarabiGothic-Regular.ttf'); $font->size(25); $font->color('#333333'); $font->align('center'); $font->valign('top'); $font->angle(30); }); $save_path = storage_path('app/public/profile/profiledefault222.png'); $img->save($save_path);
public\assets\fontsフォルダの配下に SawarabiGothic-Regular.ttf というwebフォントを格納しております。
このフォントのパス指定も色々あるようです。
パス指定を間違えると、下記errorがでましたの注意して下さい。
Internal GD font () not available. Use only 1-5.