Laravel 多图片合并生成

Laravel 多图片合并生成

效果

实现

首先,我们要拿到图片的原图,然后把需要动态替换的位置弄成空背景。

安装下我们需要用到的依赖库,特别好用,文档也很详细。

1
$ composer require intervention/image

创建一个控制器然后开始我们的操作了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

namespace App\Http\Controllers;

use Intervention\Image\ImageManagerStatic as Image;

class IndexControlle extends Controller
{
public function index()
{
// 默认背景图片路径
$default_image_path = storage_path('default.png');

// 实例化背景图像
$default_image = Image::make($default_image_path);
}
}

我们需要准备好第一个来替换的图片(这是我老婆王冰冰)。

替换前我们要知道图片替换的具体位置和图片的一个大小,为了方便截图我们生成到了蓝湖。

图片距离上方 53 像素,距离左边 25 像素,大小是 700*900 像素。

知道了图片参数那就开始进行替换处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 封面图片路径
$cover_image_path = storage_path('cover.png');

// 实例化封面图像
$cover_image = Image::make($cover_image_path)->resize(700, 900);

// 默认背景图像中插入封面图像
$default_image->insert($cover_image, 'top-left', 25, 53);

// 保存路径
$save_path = storage_path('save.png');

// 保存
$default_image->save($save_path);

这是生成的结果图片,可以看出我们预留的透明背景是有圆角的,然后这里变成了直角,图片有部分没有被切掉。其实处理起来很方便,在保存前多覆盖一层背景就可以了。

1
2
3
4
5
6
7
8
// 保存前在多插入一次背景
$default_image->insert($default_image_path, 'top-left', 0, 0);

// 保存路径
$save_path = storage_path('save.png');

// 保存
$default_image->save($save_path);

可以看到图片现在就是圆角了的,接下来制作头像部分。

用的这个图片处理库真的很方便,比如我们插入图片可以选择计算的位置,头像我们插入位置从 bottom-right 开始。

1
2
3
4
5
$avatar_image_path = storage_path('avatar.png');

$avatar_image = Image::make($avatar_image_path)->resize(260, 260);

$default_image->insert($avatar_image, 'bottom-right', 43, 41);

这样子我们的程序就算完成了。

其实最开始的时候我们可以不先实例化那个背景图像,可以先创建一个空的图像(我们是已知图片大小了的),最后保存前在添加背景图像上去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 实例化一个空图像
$default_image = Image::canvas(750, 1334);

$cover_image_path = storage_path('cover.png');

$cover_image = Image::make($cover_image_path)->resize(700, 900);

$default_image->insert($cover_image, 'top-left', 25, 53);

$avatar_image_path = storage_path('avatar.png');

$avatar_image = Image::make($avatar_image_path)->resize(260, 260);

$default_image->insert($avatar_image, 'bottom-right', 43, 41);

$default_image_path = storage_path('default.png');

$default_image->insert($default_image_path, 'top-left', 0, 0);

$save_path = storage_path('save.png');

$default_image->save($save_path);
往上