Laravel + ThinkPhP 海报生成

1. Laravel 中生成海报

依赖安装

首先,我们需要安装图像处理库 Intervention Image,这个库可以帮助我们方便地处理图像。你可以通过 Composer 安装它:

composer require intervention/image

代码实现

  1. 创建控制器

你可以创建一个控制器,来处理海报生成逻辑。通过 Artisan 命令创建控制器:

php artisan make:controller PosterController
  1. 控制器代码

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');
    }
}
  1. 路由配置

routes/web.php 中添加路由,处理表单显示和海报生成:

use App\Http\Controllers\PosterController;

Route::get('/poster', [PosterController::class, 'showForm']);
Route::post('/generate-poster', [PosterController::class, 'generatePoster']);
  1. 前端表单

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

代码实现

  1. 创建控制器

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');
    }
}
  1. 路由配置

application/route.php 文件中,配置路由:

use think\facade\Route;

Route::get('poster', 'PosterController/showForm');
Route::post('generate-poster', 'PosterController/generatePoster');
  1. 前端表单

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 来实现图像处理,区别在于框架的结构和路由配置。

请登录后发表评论

    没有评论内容