1. Laravel 中生成海报
依赖安装
首先,我们需要安装图像处理库 Intervention Image
,这个库可以帮助我们方便地处理图像。你可以通过 Composer 安装它:
composer require intervention/image
代码实现
- 创建控制器
你可以创建一个控制器,来处理海报生成逻辑。通过 Artisan 命令创建控制器:
php artisan make:controller PosterController
- 控制器代码
在 PosterController.php
中添加如下代码:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
class PosterController extends Controller
{
public function showForm()
{
return view('poster.form');
}
public function generatePoster(Request $request)
{
// 获取表单输入数据
$title = $request->input('title', '活动标题');
$time = $request->input('time', '活动时间');
$location = $request->input('location', '活动地点');
$avatar = $request->file('avatar');
// 创建海报背景
$img = Image::canvas(800, 600, '#ffffff'); // 800x600 的白色背景
// 添加文字
$img->text("活动名称:$title", 50, 50, function($font) {
$font->file(public_path('fonts/arial.ttf'));
$font->size(30);
$font->color('#000000');
});
$img->text("时间:$time", 50, 150, function($font) {
$font->file(public_path('fonts/arial.ttf'));
$font->size(30);
$font->color('#000000');
});
$img->text("地点:$location", 50, 250, function($font) {
$font->file(public_path('fonts/arial.ttf'));
$font->size(30);
$font->color('#000000');
});
// 处理头像并插入海报
if ($avatar) {
$avatarImage = Image::make($avatar)->resize(100, 100);
$img->insert($avatarImage, 'bottom-right', 20, 20);
}
// 输出到浏览器或者保存到文件
return $img->response('png');
}
}
- 路由配置
在 routes/web.php
中添加路由,处理表单显示和海报生成:
use App\Http\Controllers\PosterController;
Route::get('/poster', [PosterController::class, 'showForm']);
Route::post('/generate-poster', [PosterController::class, 'generatePoster']);
- 前端表单
在 resources/views/poster/form.blade.php
中,创建一个表单来接收用户输入并上传头像:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>生成海报</title>
</head>
<body>
<form action="/generate-poster" method="POST" enctype="multipart/form-data">
@csrf
<label for="title">活动标题:</label>
<input type="text" name="title" id="title"><br>
<label for="time">活动时间:</label>
<input type="text" name="time" id="time"><br>
<label for="location">活动地点:</label>
<input type="text" name="location" id="location"><br>
<label for="avatar">上传头像:</label>
<input type="file" name="avatar" id="avatar"><br>
<button type="submit">生成海报</button>
</form>
</body>
</html>
解释:
- Intervention Image:我们使用
Intervention Image
来创建背景,添加文字,并插入头像。它简化了图像处理的过程。 - 表单数据:通过表单接收活动标题、时间、地点和用户上传的头像。
- 图像生成:我们创建了一个 800×600 的白色背景,添加了活动的标题、时间和地点等文本,还处理了用户上传的头像,并将其放置在海报的右下角。
2. ThinkPHP 中生成海报
依赖安装
在 ThinkPHP 中,我们也可以使用 Intervention Image
库。首先需要安装它:
composer require intervention/image
代码实现
- 创建控制器
在 application/index/controller/PosterController.php
中创建控制器:
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use Intervention\Image\ImageManagerStatic as Image;
class PosterController extends Controller
{
public function showForm()
{
return $this->fetch('poster/form');
}
public function generatePoster(Request $request)
{
// 获取表单数据
$title = $request->post('title', '活动标题');
$time = $request->post('time', '活动时间');
$location = $request->post('location', '活动地点');
$avatar = $request->file('avatar');
// 创建背景图
$img = Image::canvas(800, 600, '#ffffff'); // 800x600 的白色背景
// 添加文字
$img->text("活动名称:$title", 50, 50, function($font) {
$font->file(public_path('fonts/arial.ttf'));
$font->size(30);
$font->color('#000000');
});
$img->text("时间:$time", 50, 150, function($font) {
$font->file(public_path('fonts/arial.ttf'));
$font->size(30);
$font->color('#000000');
});
$img->text("地点:$location", 50, 250, function($font) {
$font->file(public_path('fonts/arial.ttf'));
$font->size(30);
$font->color('#000000');
});
// 处理头像并插入海报
if ($avatar) {
$avatarImage = Image::make($avatar)->resize(100, 100);
$img->insert($avatarImage, 'bottom-right', 20, 20);
}
// 返回海报图片
return $img->response('png');
}
}
- 路由配置
在 application/route.php
文件中,配置路由:
use think\facade\Route;
Route::get('poster', 'PosterController/showForm');
Route::post('generate-poster', 'PosterController/generatePoster');
- 前端表单
在 application/index/view/poster/form.html
中创建上传表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>生成海报</title>
</head>
<body>
<form action="generate-poster" method="POST" enctype="multipart/form-data">
<label for="title">活动标题:</label>
<input type="text" name="title" id="title"><br>
<label for="time">活动时间:</label>
<input type="text" name="time" id="time"><br>
<label for="location">活动地点:</label>
<input type="text" name="location" id="location"><br>
<label for="avatar">上传头像:</label>
<input type="file" name="avatar" id="avatar"><br>
<button type="submit">生成海报</button>
</form>
</body>
</html>
解释:
- Intervention Image:同样使用
Intervention Image
来生成背景图,添加文字和头像。 - ThinkPHP 框架:ThinkPHP 的路由和控制器结构与 Laravel 相似,我们通过表单接收数据并生成海报。
- 图像生成和返回:最终生成的海报以 PNG 格式返回给用户。
总结
- Laravel 和 ThinkPHP 都能利用
Intervention Image
来进行图像处理,生成海报。 - 表单接收用户输入,包括活动标题、时间、地点和头像,生成图像后将其返回。
- 用户上传的头像 会被处理成指定大小,并插入到海报中的指定位置。
这两个框架的实现方式非常相似,都是基于 Intervention Image
来实现图像处理,区别在于框架的结构和路由配置。
没有评论内容