既然使用了框架,就该借助框架之利。

Laravel 之类的框架,或者说现在的所有 PHP 框架都趋向于通过 composer 进行第三方库的自动引入,这样做简洁方便。

composer 安装 Intervention Image

安装 Intervention Image 之前,需要确保 PHP 版本 >=5.4 并且安装了 fileinfo 扩展,以及 GD 库(>=2.0)或者 Imagick 扩展(>=6.5.7)。

composer require intervention/image

指令会自动将其添加到 composer.json 依赖中,下载库文件到 vendor 目录下,并更新 composer.lock 文件。

对于服务器上使用 git 部署的代码,只需要在 git pull 后执行 composer update 即可更新库文件。

集成到 Laravel

修改 config/app.php 文件

$providers 中添加:

'providers' => [
    ...
    Intervention\Image\ImageServiceProvider::class,
]

$aliases 中添加:

'aliases' => [
    ...
    'Image' => Intervention\Image\Facades\Image::class,
]

使用 Intervention Image

使用 Laravel 门面引入命名空间:

use Intervention\Image\Facades\Image;

其他框架引入命名空间:

use Intervention\Image\ImageManagerStatic as Image;

重要文档:

Intervention Image - github
Intervention Image - doc

使用 demo:

use Intervention\Image\Facades\Image;

class Images
{
    public function getContract($shop_name, $sign_img)
    {
        $saved_img = config("constants.common.temp_file_location") . date('YmdHis') . '.png';
//        $fontPath = public_path('font'.DS.'bb4171.ttf');
        $fontPath = public_path('font'.DS.'SourceHanSans-Normal.otf');
//        $bg_img = public_path('bg.png');
        $bg_img = Image::canvas(658, 931, '#fff');
//        $sign_img = Image::canvas(305, 210, '#ccc')->resize(200, 120);
        $sign_img = Image::make($sign_img)->resize(200, 120);
        $img = Image::make($bg_img)->insert($sign_img, 'bottom-right', 15,10);
        $img->text($shop_name, 500, 50, function($font) use($fontPath) {
            $font->file($fontPath);
            $font->size(20);
            $font->color('#333');
//            $font->align('left');
//            $font->valign('top');
//            $font->angle(45);
        });
        $img->save($saved_img);
        return $saved_img;
    }
}

demo 功能是在背景图右下角放置签名图片,顶部靠右部分写上商家名称,合在一起的即商户签合同(当然还缺合同内容部分及印章,添加这些内容与添加签名图片使用方法基本一致)。

参考文章:

如何使用 Laravel 图片处理包 intervention-image
laravel 使用 Intervention/image 进行图片处理

报错问题:

Internal GD font () not available. Use only 1-5
Image source not readable in ...
Can't write image data to path ...

第一个是写字字体找不到,当然可以不引入字体文件,但那样样式会无法掌控,建议下载一个思源黑体(版权免费)。
第二个是 make() 创建 Image 对象,找不到图片资源。
第三个是 save() 保存 Image 对象,路径无法写入数据。

三个问题其实是一个问题,就是文件的路径问题。或者使用相对于 public 的路径,或者是全路径,我选择了后者。

线上使用时报错:Symfony\Component\Debug\Exception\FatalThrowableError: Class 'Intervention\Image\ImageServiceProvider' not found,是因为部署环境下没有安装,需要在 git pull 后执行 composer update 来更新库文件。