diff --git a/app/Enums/Watermark/FontOption.php b/app/Enums/Watermark/FontOption.php index 68c49735..84ce7211 100644 --- a/app/Enums/Watermark/FontOption.php +++ b/app/Enums/Watermark/FontOption.php @@ -19,6 +19,9 @@ final class FontOption /** @var string 水印位置 */ const Position = 'position'; + /** @var string 旋转角度 */ + const Angle = 'angle'; + /** @var string X轴偏移量 */ const X = 'x'; diff --git a/app/Service/ImageService.php b/app/Service/ImageService.php index 3673bf2c..2bb473dd 100644 --- a/app/Service/ImageService.php +++ b/app/Service/ImageService.php @@ -210,24 +210,45 @@ class ImageService $options = collect($configs->get("drivers")[$driver]); $image = InterventionImage::make($image); + $position = $options->get(FontOption::Position, 'top-right'); + 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 + $font->valign('top') + ->file($options->get(FontOption::Font)) + ->size($options->get(FontOption::Size, 50)) + ->angle($options->get(FontOption::Angle, 0)) + ->color($options->get(FontOption::Color, '000000')); // 十六进制 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), - ); + + // 原图宽高 + $imageWidth = $image->width(); + $imageHeight = $image->height(); + + // 水印画布宽高 + $canvasWidth = $canvas->width(); + $canvasHeight = $canvas->height(); + + $offsetX = $options->get(FontOption::X, 0); + $offsetY = $options->get(FontOption::Y, 0); + + if ($position === 'tiled') { + // 平铺水印 + for ($x = 0; $x < $imageWidth; $x++) { + for ($y = 0; $y < $imageHeight; $y++) { + $image->text($text, $x, $y, fn (Font &$f) => $f = $font); + $y += $canvasHeight + $offsetY; + } + $x += $canvasWidth + $offsetX; + } + } else { + $font->applyToImage($canvas); + $image->insert($manager->make($canvas), $position, $offsetX, $offsetY); + } } if ($driver === 'image') { diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 2c59d32f..cf82fb56 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -55,11 +55,12 @@ class DatabaseSeeder extends Seeder 'font' => [ FontOption::Text => 'Lsky Pro', FontOption::Position => 'top-right', + FontOption::Angle => 0, FontOption::Size => 50, FontOption::Font => '', FontOption::Color => '#000000', - FontOption::X => 0, - FontOption::Y => 0, + FontOption::X => 10, + FontOption::Y => 10, ], 'image' => [ // TODO