From 83bee482792fcdaf2dbddd1a5f2aec854c518c53 Mon Sep 17 00:00:00 2001 From: Wisp X Date: Tue, 18 Jan 2022 14:16:40 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=96=87=E5=AD=97=E6=B0=B4?= =?UTF-8?q?=E5=8D=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Enums/GroupWatermarkConfigKey.php | 8 --- app/Enums/Watermark/FontOption.php | 27 ++++++++++ app/Enums/Watermark/ImageOption.php | 8 +++ app/Http/Controllers/User/ImageController.php | 2 +- app/Service/ImageService.php | 43 ++++++++++++++- composer.json | 3 +- composer.lock | 52 +------------------ database/seeders/DatabaseSeeder.php | 19 ++++++- 8 files changed, 97 insertions(+), 65 deletions(-) delete mode 100644 app/Enums/GroupWatermarkConfigKey.php create mode 100644 app/Enums/Watermark/FontOption.php create mode 100644 app/Enums/Watermark/ImageOption.php diff --git a/app/Enums/GroupWatermarkConfigKey.php b/app/Enums/GroupWatermarkConfigKey.php deleted file mode 100644 index decf0032..00000000 --- a/app/Enums/GroupWatermarkConfigKey.php +++ /dev/null @@ -1,8 +0,0 @@ -group->configs->get(GroupConfigKey::IsEnableWatermark)) { - // TODO 动态生成水印并缓存 + // TODO 缓存水印文件 $configs = $image->group->configs->get(GroupConfigKey::WatermarkConfigs); $contents = (string)$service->stickWatermark($contents, collect($configs))->encode(); } diff --git a/app/Service/ImageService.php b/app/Service/ImageService.php index f99635ee..3673bf2c 100644 --- a/app/Service/ImageService.php +++ b/app/Service/ImageService.php @@ -10,6 +10,7 @@ use App\Enums\Strategy\LocalOption; use App\Enums\StrategyKey; use App\Enums\UserConfigKey; use App\Enums\UserStatus; +use App\Enums\Watermark\FontOption; use App\Exceptions\UploadException; use App\Models\Group; use App\Models\Image; @@ -26,13 +27,11 @@ use Illuminate\Support\Str; use Intervention\Image\Facades\Image as InterventionImage; use Intervention\Image\Gd\Font; use Intervention\Image\ImageManager; -use JetBrains\PhpStorm\NoReturn; use League\Flysystem\Filesystem; use League\Flysystem\FilesystemAdapter; use League\Flysystem\FilesystemException; use League\Flysystem\Local\LocalFilesystemAdapter; use Overtrue\Flysystem\Qiniu\QiniuAdapter; -use Psr\Http\Message\StreamInterface; class ImageService { @@ -198,6 +197,46 @@ class ImageService }; } + /** + * 合成验证码 + * + * @param mixed $image + * @param Collection $configs + * @return \Intervention\Image\Image + */ + public function stickWatermark(mixed $image, Collection $configs): \Intervention\Image\Image + { + $driver = $configs->get('driver'); + $options = collect($configs->get("drivers")[$driver]); + $image = InterventionImage::make($image); + + if ($driver === 'font') { + $text = $options->get(FontOption::Text, Utils::config(ConfigKey::SiteName)); + $font = new Font(urldecode($text)); + $font->valign('top'); + $font->file($options->get(FontOption::Font)); + $font->size($options->get(FontOption::Size, 50)); + $font->color($options->get(FontOption::Color)); // 十六禁止 or rgba + $box = $font->getBoxSize(); + $font->text($text); + $manager = new ImageManager(); + $canvas = $manager->canvas($box['width'], $box['height']); + $font->applyToImage($canvas); + $image->insert( + $manager->make($canvas), + $options->get(FontOption::Position, 'top-right'), + $options->get(FontOption::X, 0), + $options->get(FontOption::Y, 0), + ); + } + + if ($driver === 'image') { + // TODO + } + + return $image; + } + protected function replacePathname(string $pathname, UploadedFile $file): string { $array = [ diff --git a/composer.json b/composer.json index 51a7be57..6893ae10 100644 --- a/composer.json +++ b/composer.json @@ -13,8 +13,7 @@ "laravel/framework": "^9.0", "laravel/sanctum": "^2.14", "laravel/tinker": "^2.7", - "overtrue/flysystem-qiniu": "^2.0", - "topthink/think-image": "^1.0" + "overtrue/flysystem-qiniu": "^2.0" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.6", diff --git a/composer.lock b/composer.lock index ebf09842..99edfe3e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "afa63033085cb52b18c21975da51c685", + "content-hash": "c36bb3f58e9cf016cf72e03a16057222", "packages": [ { "name": "asm89/stack-cors", @@ -5577,56 +5577,6 @@ }, "time": "2021-12-08T09:12:39+00:00" }, - { - "name": "topthink/think-image", - "version": "v1.0.7", - "source": { - "type": "git", - "url": "https://github.com/top-think/think-image.git", - "reference": "8586cf47f117481c6d415b20f7dedf62e79d5512" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/top-think/think-image/zipball/8586cf47f117481c6d415b20f7dedf62e79d5512", - "reference": "8586cf47f117481c6d415b20f7dedf62e79d5512", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-gd": "*" - }, - "require-dev": { - "phpunit/phpunit": "4.8.*", - "topthink/framework": "^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "think\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "yunwuxin", - "email": "448901948@qq.com" - } - ], - "description": "The ThinkPHP5 Image Package", - "support": { - "issues": "https://github.com/top-think/think-image/issues", - "source": "https://github.com/top-think/think-image/tree/master" - }, - "time": "2016-09-29T06:05:43+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v5.4.1", diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 9cec211a..2c59d32f 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -5,6 +5,7 @@ namespace Database\Seeders; use App\Enums\ConfigKey; use App\Enums\GroupConfigKey; use App\Enums\Mail\SmtpOption; +use App\Enums\Watermark\FontOption; use App\Models\Group; use Illuminate\Database\Seeder; use Illuminate\Support\Carbon; @@ -48,7 +49,23 @@ class DatabaseSeeder extends Seeder GroupConfigKey::IsEnableReview => false, GroupConfigKey::IsEnableWatermark => false, GroupConfigKey::IsEnableOriginalProtection => false, - GroupConfigKey::WatermarkConfigs => new \stdClass(), + GroupConfigKey::WatermarkConfigs => [ + 'driver' => 'font', + 'drivers' => [ + 'font' => [ + FontOption::Text => 'Lsky Pro', + FontOption::Position => 'top-right', + FontOption::Size => 50, + FontOption::Font => '', + FontOption::Color => '#000000', + FontOption::X => 0, + FontOption::Y => 0, + ], + 'image' => [ + // TODO + ] + ], + ], GroupConfigKey::LimitPerMinute => 20, GroupConfigKey::LimitPerHour => 100, GroupConfigKey::LimitPerDay => 300,