From 0d6ea605c49fb8d983a49102fd37d0683fe3ffde Mon Sep 17 00:00:00 2001 From: zhangke <534737859@qq.com> Date: Wed, 11 Mar 2026 18:15:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=B0=B4=E5=8D=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97=E5=8F=8A=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现完整的水印功能模块,包括配置类、工具类、持久化类和测试类。支持透明度、密度、字体样式、位置等多种配置选项,并提供测试输出验证功能。 新增 WatermarkConfiguration 配置类,支持链式调用设置水印参数 添加 WatermarkUtil 工具类,实现水印创建和添加功能 实现 WatermarkPersistence 持久化类,支持配置保存与加载 编写 WatermarkTest 测试类,验证所有功能并生成测试图片 更新 API 文档 WATERMARK_API_DOC.md 说明使用方法 --- WATERMARK_API_DOC.md | 128 +++++++ src/Main.java | 4 +- .../seal/WatermarkPersistence.java | 111 ++++++ src/cn/localhost01/seal/WatermarkTest.java | 318 ++++++++++++++++++ src/cn/localhost01/seal/WatermarkUtil.java | 176 ++++++++++ .../configuration/WatermarkConfiguration.java | 115 +++++++ .../seal/configuration/WatermarkPosition.java | 10 + test_output/1_default_watermark.png | Bin 0 -> 11382 bytes test_output/2_opacity_0.1.png | Bin 0 -> 8675 bytes test_output/2_opacity_0.5.png | Bin 0 -> 10934 bytes test_output/2_opacity_1.0.png | Bin 0 -> 10907 bytes test_output/3_high_density.png | Bin 0 -> 24044 bytes test_output/3_low_density.png | Bin 0 -> 13012 bytes test_output/4_font_heiti_red.png | Bin 0 -> 15249 bytes test_output/4_font_kaiti_blue_bold.png | Bin 0 -> 18016 bytes test_output/5_position_bottom_left.png | Bin 0 -> 3241 bytes test_output/5_position_bottom_right.png | Bin 0 -> 3650 bytes test_output/5_position_center.png | Bin 0 -> 2717 bytes test_output/5_position_tiled.png | Bin 0 -> 3459 bytes test_output/5_position_top_left.png | Bin 0 -> 2612 bytes test_output/5_position_top_right.png | Bin 0 -> 3036 bytes ...watermarked_\345\205\254\347\253\2400.png" | Bin 0 -> 16044 bytes ...watermarked_\347\247\201\347\253\2400.png" | Bin 0 -> 17215 bytes test_output/test_watermark_config.properties | 14 + 24 files changed, 874 insertions(+), 2 deletions(-) create mode 100644 WATERMARK_API_DOC.md create mode 100644 src/cn/localhost01/seal/WatermarkPersistence.java create mode 100644 src/cn/localhost01/seal/WatermarkTest.java create mode 100644 src/cn/localhost01/seal/WatermarkUtil.java create mode 100644 src/cn/localhost01/seal/configuration/WatermarkConfiguration.java create mode 100644 src/cn/localhost01/seal/configuration/WatermarkPosition.java create mode 100644 test_output/1_default_watermark.png create mode 100644 test_output/2_opacity_0.1.png create mode 100644 test_output/2_opacity_0.5.png create mode 100644 test_output/2_opacity_1.0.png create mode 100644 test_output/3_high_density.png create mode 100644 test_output/3_low_density.png create mode 100644 test_output/4_font_heiti_red.png create mode 100644 test_output/4_font_kaiti_blue_bold.png create mode 100644 test_output/5_position_bottom_left.png create mode 100644 test_output/5_position_bottom_right.png create mode 100644 test_output/5_position_center.png create mode 100644 test_output/5_position_tiled.png create mode 100644 test_output/5_position_top_left.png create mode 100644 test_output/5_position_top_right.png create mode 100644 "test_output/6_watermarked_\345\205\254\347\253\2400.png" create mode 100644 "test_output/6_watermarked_\347\247\201\347\253\2400.png" create mode 100644 test_output/test_watermark_config.properties diff --git a/WATERMARK_API_DOC.md b/WATERMARK_API_DOC.md new file mode 100644 index 0000000..89c4fbe --- /dev/null +++ b/WATERMARK_API_DOC.md @@ -0,0 +1,128 @@ +# 水印功能模块 API 文档 + +## 概述 +水印功能模块提供了为图片添加自定义水印的能力,支持透明度、密度、字体样式、位置等多种配置选项。 + +## 核心类说明 + +### 1. WatermarkPosition.java (位置枚举) +定义水印显示位置: +- `TILED` - 平铺模式(默认) +- `TOP_LEFT` - 左上角 +- `TOP_RIGHT` - 右上角 +- `BOTTOM_LEFT` - 左下角 +- `BOTTOM_RIGHT` - 右下角 +- `CENTER` - 居中 + +### 2. WatermarkConfiguration.java (配置类) +水印配置类,支持链式调用: + +| 方法 | 参数 | 说明 | 默认值 | +|------|------|------|--------| +| `setText(String)` | 水印文本 | 设置水印内容 | "水印" | +| `setOpacity(float)` | 0-1之间的浮点数 | 设置透明度 | 0.3f | +| `setHorizontalSpacing(int)` | 像素值 | 设置水平间距 | 200 | +| `setVerticalSpacing(int)` | 像素值 | 设置垂直间距 | 150 | +| `setFontFamily(String)` | 字体名称 | 设置字体 | "宋体" | +| `setFontSize(int)` | 字号 | 设置字体大小 | 30 | +| `setColor(Color)` | Color对象 | 设置字体颜色 | Color.GRAY | +| `setBold(Boolean)` | true/false | 是否加粗 | false | +| `setRotation(Double)` | 角度值 | 设置旋转角度 | -30.0 | +| `setPosition(WatermarkPosition)` | 位置枚举 | 设置显示位置 | TILED | + +### 3. WatermarkUtil.java (工具类) +水印核心功能类,提供静态方法: + +| 方法 | 说明 | +|------|------| +| `createWatermarkCanvas(width, height, config)` | 创建水印画布 | +| `createWatermarkCanvasAndStore(width, height, config, path)` | 创建水印并保存到文件 | +| `addWatermarkToImage(targetImage, config)` | 为已有图片添加水印 | +| `addWatermarkToImageAndStore(targetImage, config, outputPath)` | 为图片添加水印并保存 | +| `loadImage(path)` | 从文件加载图片 | +| `buildBytes(image)` | BufferedImage转byte数组 | +| `storeBytes(buf, fullPath)` | byte数组保存为文件 | + +### 4. WatermarkPersistence.java (持久化类) +配置保存与加载功能: + +| 方法 | 说明 | +|------|------| +| `saveConfiguration(config)` | 保存配置到默认文件 | +| `saveConfiguration(config, filePath)` | 保存配置到指定文件 | +| `loadConfiguration()` | 从默认文件加载配置 | +| `loadConfiguration(filePath)` | 从指定文件加载配置 | + +## 使用示例 + +### 基本用法 +```java +// 创建默认水印画布 +BufferedImage watermark = WatermarkUtil.createWatermarkCanvas(800, 600, new WatermarkConfiguration()); + +// 保存水印图片 +WatermarkUtil.createWatermarkCanvasAndStore(800, 600, new WatermarkConfiguration(), "output/watermark.png"); +``` + +### 自定义配置 +```java +WatermarkConfiguration config = new WatermarkConfiguration() + .setText("机密文件") + .setOpacity(0.5f) + .setHorizontalSpacing(150) + .setVerticalSpacing(100) + .setFontFamily("黑体") + .setFontSize(40) + .setColor(Color.RED) + .setBold(true) + .setRotation(-45.0); + +BufferedImage watermark = WatermarkUtil.createWatermarkCanvas(800, 600, config); +``` + +### 位置模式 +```java +// 左上角水印 +WatermarkConfiguration config = new WatermarkConfiguration("LOGO") + .setPosition(WatermarkPosition.TOP_LEFT) + .setOpacity(0.8f) + .setRotation(0.0); + +// 平铺水印 +WatermarkConfiguration tiledConfig = new WatermarkConfiguration("内部使用") + .setPosition(WatermarkPosition.TILED); +``` + +### 给已有图片添加水印 +```java +BufferedImage originalImage = WatermarkUtil.loadImage("original.png"); +WatermarkConfiguration config = new WatermarkConfiguration("已审核"); +BufferedImage result = WatermarkUtil.addWatermarkToImage(originalImage, config); +WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result), "watermarked.png"); +``` + +### 配置持久化 +```java +// 保存配置 +WatermarkConfiguration config = new WatermarkConfiguration("我的水印").setOpacity(0.4f); +WatermarkPersistence.saveConfiguration(config); + +// 加载配置 +WatermarkConfiguration loadedConfig = WatermarkPersistence.loadConfiguration(); +``` + +## 功能特点 +1. **透明度控制**:支持0-1范围精确调节 +2. **密度调节**:通过水平和垂直间距控制水印分布 +3. **样式自定义**:支持字体、字号、颜色、加粗、旋转 +4. **多种位置模式**:平铺、四角、居中共6种模式 +5. **配置持久化**:本地保存用户偏好设置 +6. **兼容性**:基于Java AWT实现,跨平台兼容 + +## 测试说明 +运行单元测试类 `WatermarkTest` 可验证所有功能: +```bash +java -ea -cp out cn.localhost01.seal.WatermarkTest +``` + +测试输出目录:`test_output/` \ No newline at end of file diff --git a/src/Main.java b/src/Main.java index 53ace54..f975662 100644 --- a/src/Main.java +++ b/src/Main.java @@ -128,7 +128,7 @@ public static void main(String[] args) throws Exception { //1.生成公章 try { - SealUtil.buildAndStoreSeal(configuration, "C:\\Users\\localhost01\\Desktop\\公章.png"); + SealUtil.buildAndStoreSeal(configuration, "D:\\公章.png"); } catch (IOException e) { e.printStackTrace(); } @@ -136,7 +136,7 @@ public static void main(String[] args) throws Exception { //2.生成私章 SealFont font = new SealFont(); font.setFontSize(120).setBold(true).setFontText("诸葛孔明"); - SealUtil.buildAndStorePersonSeal(300, 16, font, "印", "C:\\Users\\localhost01\\Desktop\\私章.png"); + SealUtil.buildAndStorePersonSeal(300, 16, font, "印", "D:\\私章.png"); } } diff --git a/src/cn/localhost01/seal/WatermarkPersistence.java b/src/cn/localhost01/seal/WatermarkPersistence.java new file mode 100644 index 0000000..2c43f2e --- /dev/null +++ b/src/cn/localhost01/seal/WatermarkPersistence.java @@ -0,0 +1,111 @@ +package cn.localhost01.seal; + +import cn.localhost01.seal.configuration.WatermarkConfiguration; +import cn.localhost01.seal.configuration.WatermarkPosition; + +import java.awt.*; +import java.io.*; +import java.util.Properties; + +public class WatermarkPersistence { + private static final String CONFIG_FILE = "watermark_config.properties"; + private static final String KEY_TEXT = "watermark.text"; + private static final String KEY_OPACITY = "watermark.opacity"; + private static final String KEY_HORIZONTAL_SPACING = "watermark.horizontalSpacing"; + private static final String KEY_VERTICAL_SPACING = "watermark.verticalSpacing"; + private static final String KEY_FONT_FAMILY = "watermark.fontFamily"; + private static final String KEY_FONT_SIZE = "watermark.fontSize"; + private static final String KEY_COLOR_RED = "watermark.color.red"; + private static final String KEY_COLOR_GREEN = "watermark.color.green"; + private static final String KEY_COLOR_BLUE = "watermark.color.blue"; + private static final String KEY_IS_BOLD = "watermark.isBold"; + private static final String KEY_ROTATION = "watermark.rotation"; + private static final String KEY_POSITION = "watermark.position"; + + public static void saveConfiguration(WatermarkConfiguration config) throws IOException { + saveConfiguration(config, CONFIG_FILE); + } + + public static void saveConfiguration(WatermarkConfiguration config, String filePath) throws IOException { + Properties props = new Properties(); + props.setProperty(KEY_TEXT, config.getText()); + props.setProperty(KEY_OPACITY, String.valueOf(config.getOpacity())); + props.setProperty(KEY_HORIZONTAL_SPACING, String.valueOf(config.getHorizontalSpacing())); + props.setProperty(KEY_VERTICAL_SPACING, String.valueOf(config.getVerticalSpacing())); + props.setProperty(KEY_FONT_FAMILY, config.getFontFamily()); + props.setProperty(KEY_FONT_SIZE, String.valueOf(config.getFontSize())); + props.setProperty(KEY_COLOR_RED, String.valueOf(config.getColor().getRed())); + props.setProperty(KEY_COLOR_GREEN, String.valueOf(config.getColor().getGreen())); + props.setProperty(KEY_COLOR_BLUE, String.valueOf(config.getColor().getBlue())); + props.setProperty(KEY_IS_BOLD, String.valueOf(config.isBold())); + props.setProperty(KEY_ROTATION, String.valueOf(config.getRotation())); + props.setProperty(KEY_POSITION, config.getPosition().name()); + + try (OutputStream out = new FileOutputStream(filePath)) { + props.store(out, "Watermark Configuration"); + } + } + + public static WatermarkConfiguration loadConfiguration() throws IOException { + return loadConfiguration(CONFIG_FILE); + } + + public static WatermarkConfiguration loadConfiguration(String filePath) throws IOException { + File configFile = new File(filePath); + if (!configFile.exists()) { + return new WatermarkConfiguration(); + } + + Properties props = new Properties(); + try (InputStream in = new FileInputStream(filePath)) { + props.load(in); + } + + WatermarkConfiguration config = new WatermarkConfiguration(); + + config.setText(props.getProperty(KEY_TEXT, "水印")); + + try { + float opacity = Float.parseFloat(props.getProperty(KEY_OPACITY, "0.3")); + config.setOpacity(opacity); + } catch (NumberFormatException ignored) {} + + try { + int hSpacing = Integer.parseInt(props.getProperty(KEY_HORIZONTAL_SPACING, "200")); + config.setHorizontalSpacing(hSpacing); + } catch (NumberFormatException ignored) {} + + try { + int vSpacing = Integer.parseInt(props.getProperty(KEY_VERTICAL_SPACING, "150")); + config.setVerticalSpacing(vSpacing); + } catch (NumberFormatException ignored) {} + + config.setFontFamily(props.getProperty(KEY_FONT_FAMILY, "宋体")); + + try { + int fontSize = Integer.parseInt(props.getProperty(KEY_FONT_SIZE, "30")); + config.setFontSize(fontSize); + } catch (NumberFormatException ignored) {} + + try { + int r = Integer.parseInt(props.getProperty(KEY_COLOR_RED, "128")); + int g = Integer.parseInt(props.getProperty(KEY_COLOR_GREEN, "128")); + int b = Integer.parseInt(props.getProperty(KEY_COLOR_BLUE, "128")); + config.setColor(new Color(r, g, b)); + } catch (NumberFormatException ignored) {} + + config.setBold(Boolean.parseBoolean(props.getProperty(KEY_IS_BOLD, "false"))); + + try { + double rotation = Double.parseDouble(props.getProperty(KEY_ROTATION, "-30.0")); + config.setRotation(rotation); + } catch (NumberFormatException ignored) {} + + try { + String positionStr = props.getProperty(KEY_POSITION, "TILED"); + config.setPosition(WatermarkPosition.valueOf(positionStr)); + } catch (IllegalArgumentException ignored) {} + + return config; + } +} diff --git a/src/cn/localhost01/seal/WatermarkTest.java b/src/cn/localhost01/seal/WatermarkTest.java new file mode 100644 index 0000000..9d7f75d --- /dev/null +++ b/src/cn/localhost01/seal/WatermarkTest.java @@ -0,0 +1,318 @@ +package cn.localhost01.seal; + +import cn.localhost01.seal.configuration.WatermarkConfiguration; +import cn.localhost01.seal.configuration.WatermarkPosition; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +public class WatermarkTest { + + private static final String TEST_OUTPUT_DIR = "test_output/"; + + private static void assertFileExists(String filePath) { + File file = new File(filePath); + assert file.exists() : "文件不存在: " + filePath; + assert file.length() > 0 : "文件为空: " + filePath; + } + + private static void assertImageDimensions(BufferedImage image, int expectedWidth, int expectedHeight) { + assert image != null : "图像不能为空"; + assert image.getWidth() == expectedWidth : "宽度不匹配: 期望 " + expectedWidth + ", 实际 " + image.getWidth(); + assert image.getHeight() == expectedHeight : "高度不匹配: 期望 " + expectedHeight + ", 实际 " + image.getHeight(); + } + + private static void assertImageHasContent(BufferedImage image) throws IOException { + boolean hasNonTransparentPixel = false; + int width = image.getWidth(); + int height = image.getHeight(); + int step = Math.max(1, Math.min(width, height) / 50); + for (int x = 0; x < width; x += step) { + for (int y = 0; y < height; y += step) { + int pixel = image.getRGB(x, y); + if ((pixel >> 24) != 0x00) { + hasNonTransparentPixel = true; + break; + } + } + if (hasNonTransparentPixel) break; + } + assert hasNonTransparentPixel : "图像没有可见内容"; + } + + private static void assertWatermarkApplied(BufferedImage original, BufferedImage watermarked) { + assert watermarked != null : "水印图像不能为空"; + assert original.getWidth() == watermarked.getWidth() : "水印后宽度改变"; + assert original.getHeight() == watermarked.getHeight() : "水印后高度改变"; + boolean hasDifference = false; + int checkCount = 0; + for (int x = 0; x < original.getWidth() && checkCount < 1000; x += 10) { + for (int y = 0; y < original.getHeight() && checkCount < 1000; y += 10) { + if (original.getRGB(x, y) != watermarked.getRGB(x, y)) { + hasDifference = true; + break; + } + checkCount++; + } + if (hasDifference) break; + } + assert hasDifference : "水印未应用到图像"; + } + + public static void main(String[] args) throws Exception { + System.out.println("=== 水印功能单元测试开始 ==="); + + File testDir = new File(TEST_OUTPUT_DIR); + if (!testDir.exists()) { + testDir.mkdirs(); + } + + testDefaultWatermark(); + testOpacitySettings(); + testDensitySettings(); + testFontSettings(); + testPositionSettings(); + testPersistence(); + testAddWatermarkToExistingImage(); + + System.out.println("=== 水印功能单元测试完成 ==="); + System.out.println("测试输出目录: " + new File(TEST_OUTPUT_DIR).getAbsolutePath()); + } + + private static void testDefaultWatermark() throws IOException { + System.out.print("测试默认水印配置... "); + WatermarkConfiguration config = new WatermarkConfiguration(); + + assert "水印".equals(config.getText()) : "默认文本不正确"; + assert config.getOpacity() == 0.3f : "默认透明度不正确"; + assert config.getHorizontalSpacing() == 200 : "默认水平间距不正确"; + assert config.getPosition() == WatermarkPosition.TILED : "默认位置不正确"; + + BufferedImage result = WatermarkUtil.createWatermarkCanvas(800, 600, config); + assertImageDimensions(result, 800, 600); + assertImageHasContent(result); + + String filePath = TEST_OUTPUT_DIR + "1_default_watermark.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result), filePath); + assertFileExists(filePath); + + System.out.println("通过"); + } + + private static void testOpacitySettings() throws IOException { + System.out.print("测试透明度设置... "); + + WatermarkConfiguration config1 = new WatermarkConfiguration("透明度测试") + .setOpacity(0.1f); + assert config1.getOpacity() == 0.1f : "透明度0.1设置失败"; + BufferedImage result1 = WatermarkUtil.createWatermarkCanvas(400, 300, config1); + assertImageDimensions(result1, 400, 300); + String file1 = TEST_OUTPUT_DIR + "2_opacity_0.1.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result1), file1); + assertFileExists(file1); + + WatermarkConfiguration config2 = new WatermarkConfiguration("透明度测试") + .setOpacity(0.5f); + assert config2.getOpacity() == 0.5f : "透明度0.5设置失败"; + BufferedImage result2 = WatermarkUtil.createWatermarkCanvas(400, 300, config2); + assertImageDimensions(result2, 400, 300); + String file2 = TEST_OUTPUT_DIR + "2_opacity_0.5.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result2), file2); + assertFileExists(file2); + + WatermarkConfiguration config3 = new WatermarkConfiguration("透明度测试") + .setOpacity(1.0f); + assert config3.getOpacity() == 1.0f : "透明度1.0设置失败"; + BufferedImage result3 = WatermarkUtil.createWatermarkCanvas(400, 300, config3); + assertImageDimensions(result3, 400, 300); + String file3 = TEST_OUTPUT_DIR + "2_opacity_1.0.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result3), file3); + assertFileExists(file3); + + WatermarkConfiguration configInvalidLow = new WatermarkConfiguration().setOpacity(-0.5f); + assert configInvalidLow.getOpacity() == 0.0f : "透明度边界最小值验证失败"; + + WatermarkConfiguration configInvalidHigh = new WatermarkConfiguration().setOpacity(2.0f); + assert configInvalidHigh.getOpacity() == 1.0f : "透明度边界最大值验证失败"; + + System.out.println("通过"); + } + + private static void testDensitySettings() throws IOException { + System.out.print("测试密度(间距)设置... "); + + WatermarkConfiguration config1 = new WatermarkConfiguration("高密度") + .setHorizontalSpacing(100) + .setVerticalSpacing(80); + assert config1.getHorizontalSpacing() == 100 : "水平间距100设置失败"; + assert config1.getVerticalSpacing() == 80 : "垂直间距80设置失败"; + BufferedImage result1 = WatermarkUtil.createWatermarkCanvas(800, 600, config1); + assertImageDimensions(result1, 800, 600); + assertImageHasContent(result1); + String file1 = TEST_OUTPUT_DIR + "3_high_density.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result1), file1); + assertFileExists(file1); + + WatermarkConfiguration config2 = new WatermarkConfiguration("低密度") + .setHorizontalSpacing(300) + .setVerticalSpacing(200); + assert config2.getHorizontalSpacing() == 300 : "水平间距300设置失败"; + assert config2.getVerticalSpacing() == 200 : "垂直间距200设置失败"; + BufferedImage result2 = WatermarkUtil.createWatermarkCanvas(800, 600, config2); + assertImageDimensions(result2, 800, 600); + assertImageHasContent(result2); + String file2 = TEST_OUTPUT_DIR + "3_low_density.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result2), file2); + assertFileExists(file2); + + WatermarkConfiguration configInvalid = new WatermarkConfiguration() + .setHorizontalSpacing(-10) + .setVerticalSpacing(0); + assert configInvalid.getHorizontalSpacing() == 1 : "水平间距边界验证失败"; + assert configInvalid.getVerticalSpacing() == 1 : "垂直间距边界验证失败"; + + System.out.println("通过"); + } + + private static void testFontSettings() throws IOException { + System.out.print("测试字体样式设置... "); + + WatermarkConfiguration config1 = new WatermarkConfiguration("楷体水印") + .setFontFamily("楷体") + .setFontSize(40) + .setColor(Color.BLUE) + .setBold(true); + assert "楷体".equals(config1.getFontFamily()) : "字体设置失败"; + assert config1.getFontSize() == 40 : "字号40设置失败"; + assert Color.BLUE.equals(config1.getColor()) : "颜色设置失败"; + assert config1.isBold() == true : "加粗设置失败"; + BufferedImage result1 = WatermarkUtil.createWatermarkCanvas(800, 600, config1); + assertImageDimensions(result1, 800, 600); + assertImageHasContent(result1); + String file1 = TEST_OUTPUT_DIR + "4_font_kaiti_blue_bold.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result1), file1); + assertFileExists(file1); + + WatermarkConfiguration config2 = new WatermarkConfiguration("黑体红字") + .setFontFamily("黑体") + .setFontSize(25) + .setColor(Color.RED); + assert "黑体".equals(config2.getFontFamily()) : "字体设置失败"; + assert config2.getFontSize() == 25 : "字号25设置失败"; + assert Color.RED.equals(config2.getColor()) : "颜色设置失败"; + BufferedImage result2 = WatermarkUtil.createWatermarkCanvas(800, 600, config2); + assertImageDimensions(result2, 800, 600); + assertImageHasContent(result2); + String file2 = TEST_OUTPUT_DIR + "4_font_heiti_red.png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result2), file2); + assertFileExists(file2); + + WatermarkConfiguration configInvalidSize = new WatermarkConfiguration().setFontSize(-5); + assert configInvalidSize.getFontSize() == 1 : "字号边界验证失败"; + + System.out.println("通过"); + } + + private static void testPositionSettings() throws IOException { + System.out.print("测试位置设置... "); + + assert WatermarkPosition.values().length == 6 : "位置枚举数量不正确"; + + for (WatermarkPosition position : WatermarkPosition.values()) { + WatermarkConfiguration config = new WatermarkConfiguration(position.name()) + .setPosition(position) + .setOpacity(0.8f) + .setFontSize(30) + .setRotation(0.0); + assert config.getPosition() == position : "位置设置失败: " + position; + BufferedImage result = WatermarkUtil.createWatermarkCanvas(400, 300, config); + assertImageDimensions(result, 400, 300); + assertImageHasContent(result); + String filePath = TEST_OUTPUT_DIR + "5_position_" + position.name().toLowerCase() + ".png"; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(result), filePath); + assertFileExists(filePath); + } + + System.out.println("通过"); + } + + private static void testPersistence() throws IOException { + System.out.print("测试持久化功能... "); + + WatermarkConfiguration original = new WatermarkConfiguration("持久化测试") + .setOpacity(0.4f) + .setHorizontalSpacing(150) + .setVerticalSpacing(120) + .setFontFamily("黑体") + .setFontSize(35) + .setColor(Color.MAGENTA) + .setBold(true) + .setRotation(-15.0) + .setPosition(WatermarkPosition.CENTER); + + String testConfigPath = TEST_OUTPUT_DIR + "test_watermark_config.properties"; + WatermarkPersistence.saveConfiguration(original, testConfigPath); + + WatermarkConfiguration loaded = WatermarkPersistence.loadConfiguration(testConfigPath); + + assert original.getText().equals(loaded.getText()) : "文本不匹配"; + assert original.getOpacity() == loaded.getOpacity() : "透明度不匹配"; + assert original.getHorizontalSpacing() == loaded.getHorizontalSpacing() : "水平间距不匹配"; + assert original.getVerticalSpacing() == loaded.getVerticalSpacing() : "垂直间距不匹配"; + assert original.getFontFamily().equals(loaded.getFontFamily()) : "字体不匹配"; + assert original.getFontSize() == loaded.getFontSize() : "字号不匹配"; + assert original.getColor().equals(loaded.getColor()) : "颜色不匹配"; + assert original.isBold().equals(loaded.isBold()) : "加粗不匹配"; + assert original.getRotation().equals(loaded.getRotation()) : "旋转不匹配"; + assert original.getPosition() == loaded.getPosition() : "位置不匹配"; + + System.out.println("通过"); + } + + private static void testAddWatermarkToExistingImage() throws Exception { + System.out.print("测试给已有图片添加水印... "); + + BufferedImage testOriginal = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB); + Graphics2D g = testOriginal.createGraphics(); + g.setColor(Color.WHITE); + g.fillRect(0, 0, 200, 200); + g.dispose(); + + WatermarkConfiguration config = new WatermarkConfiguration("测试水印") + .setOpacity(0.5f) + .setColor(Color.BLACK); + BufferedImage result = WatermarkUtil.addWatermarkToImage(testOriginal, config); + assertImageDimensions(result, 200, 200); + assertWatermarkApplied(testOriginal, result); + + BufferedImage nullResult1 = WatermarkUtil.addWatermarkToImage(null, config); + assert nullResult1 == null : "空图像应返回null"; + + BufferedImage nullResult2 = WatermarkUtil.addWatermarkToImage(testOriginal, null); + assert nullResult2 == testOriginal : "空配置应返回原图"; + + String[] sampleImages = { + "img/公章0.png", + "img/私章0.png" + }; + + for (String imgPath : sampleImages) { + File imgFile = new File(imgPath); + if (imgFile.exists()) { + BufferedImage originalImage = WatermarkUtil.loadImage(imgPath); + assert originalImage != null : "无法加载测试图像: " + imgPath; + BufferedImage watermarked = WatermarkUtil.addWatermarkToImage(originalImage, config); + assert watermarked != null : "水印添加失败"; + assertImageDimensions(watermarked, originalImage.getWidth(), originalImage.getHeight()); + String fileName = new File(imgPath).getName(); + String outputPath = TEST_OUTPUT_DIR + "6_watermarked_" + fileName; + WatermarkUtil.storeBytes(WatermarkUtil.buildBytes(watermarked), outputPath); + assertFileExists(outputPath); + } + } + + System.out.println("通过"); + } +} diff --git a/src/cn/localhost01/seal/WatermarkUtil.java b/src/cn/localhost01/seal/WatermarkUtil.java new file mode 100644 index 0000000..5ccffac --- /dev/null +++ b/src/cn/localhost01/seal/WatermarkUtil.java @@ -0,0 +1,176 @@ +package cn.localhost01.seal; + +import cn.localhost01.seal.configuration.WatermarkConfiguration; +import cn.localhost01.seal.configuration.WatermarkPosition; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.*; + +public abstract class WatermarkUtil { + + public static byte[] buildBytes(BufferedImage image) throws IOException { + try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) { + ImageIO.write(image, "png", outStream); + return outStream.toByteArray(); + } + } + + public static void storeBytes(byte[] buf, String fullPath) throws IOException { + File file = new File(fullPath); + File dir = file.getParentFile(); + if (dir != null && !dir.exists()) { + dir.mkdirs(); + } + try (FileOutputStream fos = new FileOutputStream(file); + BufferedOutputStream bos = new BufferedOutputStream(fos)) { + bos.write(buf); + } + } + + public static BufferedImage addWatermarkToImage(BufferedImage targetImage, WatermarkConfiguration config) { + if (targetImage == null || config == null) { + return targetImage; + } + + int width = targetImage.getWidth(); + int height = targetImage.getHeight(); + + BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = result.createGraphics(); + + g2d.drawImage(targetImage, 0, 0, null); + + applyWatermark(g2d, width, height, config); + + g2d.dispose(); + return result; + } + + public static void addWatermarkToImageAndStore(BufferedImage targetImage, WatermarkConfiguration config, String outputPath) throws IOException { + BufferedImage result = addWatermarkToImage(targetImage, config); + storeBytes(buildBytes(result), outputPath); + } + + public static BufferedImage createWatermarkCanvas(int width, int height, WatermarkConfiguration config) { + if (config == null) { + config = new WatermarkConfiguration(); + } + + BufferedImage canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = canvas.createGraphics(); + + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0)); + g2d.fillRect(0, 0, width, height); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1)); + + applyWatermark(g2d, width, height, config); + + g2d.dispose(); + return canvas; + } + + public static void createWatermarkCanvasAndStore(int width, int height, WatermarkConfiguration config, String outputPath) throws IOException { + BufferedImage result = createWatermarkCanvas(width, height, config); + storeBytes(buildBytes(result), outputPath); + } + + private static void applyWatermark(Graphics2D g2d, int width, int height, WatermarkConfiguration config) { + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, config.getOpacity()); + g2d.setComposite(alphaComposite); + + int fontStyle = config.isBold() ? Font.BOLD : Font.PLAIN; + Font font = new Font(config.getFontFamily(), fontStyle, config.getFontSize()); + g2d.setFont(font); + g2d.setColor(config.getColor()); + + FontMetrics metrics = g2d.getFontMetrics(); + Rectangle2D textBounds = metrics.getStringBounds(config.getText(), g2d); + int textWidth = (int) textBounds.getWidth(); + int textHeight = (int) textBounds.getHeight(); + + if (config.getPosition() == WatermarkPosition.TILED) { + drawTiledWatermark(g2d, width, height, config, textWidth, textHeight); + } else { + drawSinglePositionWatermark(g2d, width, height, config, textWidth, textHeight); + } + } + + private static void drawTiledWatermark(Graphics2D g2d, int width, int height, + WatermarkConfiguration config, int textWidth, int textHeight) { + int hSpacing = config.getHorizontalSpacing(); + int vSpacing = config.getVerticalSpacing(); + double rotation = Math.toRadians(config.getRotation()); + + int effectiveWidth = textWidth + hSpacing; + int effectiveHeight = textHeight + vSpacing; + + int cols = (width / effectiveWidth) + 2; + int rows = (height / effectiveHeight) + 2; + + for (int row = 0; row < rows; row++) { + for (int col = 0; col < cols; col++) { + int x = col * effectiveWidth; + int y = row * effectiveHeight + textHeight; + + if (rotation != 0) { + g2d.rotate(rotation, x + textWidth / 2.0, y - textHeight / 2.0); + } + + g2d.drawString(config.getText(), x, y); + + if (rotation != 0) { + g2d.rotate(-rotation, x + textWidth / 2.0, y - textHeight / 2.0); + } + } + } + } + + private static void drawSinglePositionWatermark(Graphics2D g2d, int width, int height, + WatermarkConfiguration config, int textWidth, int textHeight) { + int x = 0, y = 0; + double rotation = Math.toRadians(config.getRotation()); + + switch (config.getPosition()) { + case TOP_LEFT: + x = 10; + y = textHeight + 10; + break; + case TOP_RIGHT: + x = width - textWidth - 10; + y = textHeight + 10; + break; + case BOTTOM_LEFT: + x = 10; + y = height - 10; + break; + case BOTTOM_RIGHT: + x = width - textWidth - 10; + y = height - 10; + break; + case CENTER: + x = (width - textWidth) / 2; + y = (height + textHeight) / 2; + break; + } + + if (rotation != 0) { + g2d.rotate(rotation, x + textWidth / 2.0, y - textHeight / 2.0); + } + + g2d.drawString(config.getText(), x, y); + + if (rotation != 0) { + g2d.rotate(-rotation, x + textWidth / 2.0, y - textHeight / 2.0); + } + } + + public static BufferedImage loadImage(String path) throws IOException { + return ImageIO.read(new File(path)); + } +} diff --git a/src/cn/localhost01/seal/configuration/WatermarkConfiguration.java b/src/cn/localhost01/seal/configuration/WatermarkConfiguration.java new file mode 100644 index 0000000..2823cf5 --- /dev/null +++ b/src/cn/localhost01/seal/configuration/WatermarkConfiguration.java @@ -0,0 +1,115 @@ +package cn.localhost01.seal.configuration; + +import java.awt.*; + +public class WatermarkConfiguration { + private String text = "水印"; + private float opacity = 0.3f; + private int horizontalSpacing = 200; + private int verticalSpacing = 150; + private String fontFamily = "宋体"; + private int fontSize = 30; + private Color color = Color.GRAY; + private Boolean isBold = false; + private Double rotation = -30.0; + private WatermarkPosition position = WatermarkPosition.TILED; + + public WatermarkConfiguration() { + } + + public WatermarkConfiguration(String text) { + this.text = text; + } + + public WatermarkConfiguration setText(String text) { + this.text = text; + return this; + } + + public WatermarkConfiguration setOpacity(float opacity) { + if (opacity < 0) opacity = 0; + if (opacity > 1) opacity = 1; + this.opacity = opacity; + return this; + } + + public WatermarkConfiguration setHorizontalSpacing(int horizontalSpacing) { + this.horizontalSpacing = Math.max(1, horizontalSpacing); + return this; + } + + public WatermarkConfiguration setVerticalSpacing(int verticalSpacing) { + this.verticalSpacing = Math.max(1, verticalSpacing); + return this; + } + + public WatermarkConfiguration setFontFamily(String fontFamily) { + this.fontFamily = fontFamily; + return this; + } + + public WatermarkConfiguration setFontSize(int fontSize) { + this.fontSize = Math.max(1, fontSize); + return this; + } + + public WatermarkConfiguration setColor(Color color) { + this.color = color; + return this; + } + + public WatermarkConfiguration setBold(Boolean bold) { + isBold = bold; + return this; + } + + public WatermarkConfiguration setRotation(Double rotation) { + this.rotation = rotation; + return this; + } + + public WatermarkConfiguration setPosition(WatermarkPosition position) { + this.position = position; + return this; + } + + public String getText() { + return text; + } + + public float getOpacity() { + return opacity; + } + + public int getHorizontalSpacing() { + return horizontalSpacing; + } + + public int getVerticalSpacing() { + return verticalSpacing; + } + + public String getFontFamily() { + return fontFamily; + } + + public int getFontSize() { + return fontSize; + } + + public Color getColor() { + return color; + } + + public Boolean isBold() { + return isBold; + } + + public Double getRotation() { + return rotation; + } + + public WatermarkPosition getPosition() { + return position; + } +} diff --git a/src/cn/localhost01/seal/configuration/WatermarkPosition.java b/src/cn/localhost01/seal/configuration/WatermarkPosition.java new file mode 100644 index 0000000..8f36037 --- /dev/null +++ b/src/cn/localhost01/seal/configuration/WatermarkPosition.java @@ -0,0 +1,10 @@ +package cn.localhost01.seal.configuration; + +public enum WatermarkPosition { + TILED, + TOP_LEFT, + TOP_RIGHT, + BOTTOM_LEFT, + BOTTOM_RIGHT, + CENTER +} diff --git a/test_output/1_default_watermark.png b/test_output/1_default_watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cce6531f74fe55bedcc3fabcaea5ab1fd92460 GIT binary patch literal 11382 zcmeI2`#;ltAIHCvbXS+ zG-o*sV|#?norUEzrJ>l?HcVN$$GY#k>;4O_`+j_X`8@Xcem|c*KA+e7^?C34d4HDT z>}dVNHic~f0Q_KUW8ne-l6wJQll#^!q9+fcu15fXj)|>>`I%@h*2Ear!*X=X)Nh-& z?v!69K2!9e@9qjmS!t`2A(WR z=#)W~tfsju??@z4{0S5~-biNLa8bhfy`;ON7Q&&IP+aPqU*Mn)%P!!^Nb!#wLEPiS z0~?`AyGw0Ul+&zWpWnEM5BKLS)I)ddRKMIIB*P;vz) z)iY=T3zP;MyX99AS<{qd#MH+@>0_mksgL%ZHJWN%=C6l8KNTA9B9L=#yQnarfz{rG zuRcZu1$d*^^O&U%`BxH%mM|dGG=Zom)mI4ZqY-m%Ii<>-z|`T$vucEBW^bkmvPP2+ z(+;?*1t&E4cf2WvB-p_^F4=UN@0W^fg?77@I+%KTco-cuiDHe`TNg$5(xq9EwB8ku z6XqsESc#-0Q$RZosMseZU41UoDJWGyR&&nw-(+#)q(y zNs0gNUXJUu_wevoo2-WR(o^0{4(RzIQ=`x^RhmT<3MIbIzk^3xU#(Al$y8xTc=*~8 zcplpgepV~Z?Itf8ubg|iuHVoDy-IU3n=tZMa(CGfu`(Yj%ptX8ANNi!O13ZK7<1SrBTh!tma zco(R5npJVN{a=*A$w{@)**foHd%D zN`8L1?uvv<1XG)g*;8xxQ){iUO0NYv7AT$`xkcbMNyAcpWY{SLYWuOgmko)hhK*ze z7;Ks8Ro7l7G5Ug9Y*QX&@zHuvfgw!XUG;(eUz?K5X7-HYwcBqTo^fEr8s4c{?jw#y z<{U}0KG*Z5(Cw+`ry=P9JIrN&q!Y(UFs84x;{RTWqBDn zcRR{Oz78< z@|C`9&+Decqu6YXxJF!eaH#2>%L}LRQ7CL z@%RTr(m{i&Bw|kT^SPz@5!gcov-34qBCU!{!n{N~43@d1mpO}ig788s1RA_WjWyGH z59*PEKesWr=s2$D2jKT}A{}%u89z)()`vtg0?@wB@3@^AT+=|+8Cksp+a6b<9#>vd zS0THiS*@;L?mVroUYl|JsRL#$9^L>M{Ee}XYSCSE3O+qiyR$4+K#uRoAItEaz4gYD zK*Ms>8m5Bv3(ewyGa}PGUfufxwE{=}vJ`0|C!2lN4ug)3U2Ws7jxf2?tjN?`kl!<} z4fJdeL)HUX;*4=7cFFt!qO2Hy?A&74%(EMl7Z0KK+xZxWr0qeW&{_=)Z8ImTyT7cp zV035`B4Wdt&aBtctnTL9Nvlm=^}!=5DLSSOM~ypKRa`$Es$+KsIba0E9@s3iM?9^;f-B8u&um5 zUf=6ogl!ZfbTJ`uBjo}^s&RK^@{dAEd}c>2*SGpT{>}C{zfPwI8u7+F9^awGD;ZK~ z@u<6${y4(4M(n6HJV*cR77D4R9GnST)lvM!nXjKHB%ss1c?`sip3oTQQQ;(gQ(cU^JdC?D2mgm>0yYHv5K z^?B>9l|A6+h~g!UMfzO(Cc9|Ulvv^hqZb={i`(Z@^7KXz{_&lIE`qN@r8oOsxx%l% ze;R`k{r*&(_--YBfq}CrHB&vjmAR`bJ%<$1^5IU4md3uCg!oq~kV={F=UY`(6=;_t zETh=xwEm3#>x&U(yHf8DVcAs7B9@@Z+c{d%!W@p2tP}1s#N*@J9uF;6E$-g zp)%vB@8x>iPN|u@@Lx|`hlhu;>$EUA(~ehKkz7dz-+{pc?;2-ndSj1F;>%b`aY^ zYzMI&#C8zdL2L(}h-n5LZ3nCEV6`2rwu9Anu-d+HH3VWi zSjPu1D*nvZHXycx*bZVli0vS@gV+vYJBaQ7GuZwWa<|$teDc`HMbW=M09#8(i>JqZ GuKyDSw-2=d literal 0 HcmV?d00001 diff --git a/test_output/2_opacity_0.1.png b/test_output/2_opacity_0.1.png new file mode 100644 index 0000000000000000000000000000000000000000..038428fc5e5baf8348c7bae263db5b99906d1f14 GIT binary patch literal 8675 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 OHHeyyYR$91qy7iM%=hE~ literal 0 HcmV?d00001 diff --git a/test_output/2_opacity_0.5.png b/test_output/2_opacity_0.5.png new file mode 100644 index 0000000000000000000000000000000000000000..9abc3bd3be152eeea98875723924df8d50b9e602 GIT binary patch literal 10934 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

lr{ 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 G(D;WMo{+Paik64Rf2MI|ps1h(265 z9s1+gmCTfu)8}o6c7Qhg>yERmPSGEC-orJh~&vgrHYhK#=hX2lp)VhX*8 z5`X1y9cz8f^YO1l*=J)%^nCXFrI}v13 zF{7`q?^aS$5TMB`CMbQ-+0k=786kJ z8Z&FywuFOWL`fKX20idq5BpQR8ZIvcP7^<#f^0JzQr+-G^24v}uiUym@;eEXCQqS| z#UjDm3c9WW5#BYb#xWi>e~b`zjV5q2p}1T`ecsNWKUuj;<3Tl2H9^%@$z_vwjgN9} zvw56IG)P6TdPO(g+CH|GQ7~7h;TxAyn<`+3c6~J7wM+8s<#Qj`4o+1u(1Hr3=UCWc z`qC1=%0h1Dv6e#t$wspY0eBV(#MN&dD1!(`QU+qOsty!Fbhf8C$x z$RN+O4C7Z;wi|YH#bLisZub`DXeI5tBa^KV{s>x zOKSr-LJJtK7>l2Sac5q2u%a(Yjd}gamhN3b=iKNZcS7yWuq{ql!OrQvKW%c@zwFIjr_rQp`Bu%I?vAP71r`jQ z?1r$9LR7vL&E=G!az>8=2bDeB@mbDBZuSg5YS$QzZPvX+KNG+fZ|)%Eyj(AA+edjIPM7a>1sx;_auOg!PI{bYHLU)@2X! z=0?S5_z3EC^p{rw%&%@aQ+Z1nTzz56{EcVDb8~ZID;)d&Y)&z}B?e}!S-M#|rM(&t z_P3Q8ABqhezC%a4vdKmA-NVlgY#5atZpcP0B@imD#4Quzhw`+_5A`*0vSptYqr6Ow z4ldm;9rJ1XZDvZpZd%J-eRMK9p(1r=$8_i};T+(9>$%19t(=}f7Sl}2E+XA7M$qy$ zH1RJKI3k6|<7syeXE*aXcLPR%G`6o~hN#ScZwo=sOrEV2-YiD!Gd#MTkedchCZl0<^LF9bzL z)*6*AImon48>btM%}4abG-73q&ljRMsRq{ta^%Iex+>}gENdLDFHtr3lfag&+#=f_ z_lR5B=jyY@$o)6zM6I;BPJ=$vYj{sDanMyR^DXw?Fvf%Ih9G)Or(CIez+<9T3LW~f z>9>7aW}~KV^G@S0a~2RH@Uc;@S+D%BfB%S0lC^Z<0M}`hGJr`=g10{yd*R6=%{x?$ zU(sJ2s+%}g`3L<3hgYEV+%5H+Ul5${uGj$@KY#_H+8y`o8oq2l`bjQ)y8oxI?ap`~ zh(o#^G^2*&t=-UJG8}mG;+ud0_2))A`nT6XR>1h0103_oVgq zoDk3kS)D|0j9{qD?-cFEvt@JhhoQ``Tf{-Hb8~VoK+-a0uNNtu51^7t!j%<1(|l^i za6*++T#j!LLwoqIDF4MjJ&19`Ve@0{TU(a2a*?p2lcS;cOz)Zgh{V7aaPqiD3#$8- z21PEU*0#^Mt-f<1qxSexzvR_-ORW+2+W_3=V`5;aXpk-6tC8jMu6%&kg{m44j_ zT%V_k_%t+qeQ>=t&(y(hIz3Omvw@h?BkcD{L^f+5taOcc9VZ|vSk*o$+1;O@_GB)( zLd9_{Fx`JIwt34TsIQ|Y<6qe^0h;`xg!2hlIW1eP94O5x(h!&KVRuIugdC*UflpBU ziFC3|l^s^Ya*X3QsI_LC=f|n{Yh9u(DkgW|P?EkM_Uq50c%#I-O`Z##lfYg@&W zSGy&y0G(+s>v$XJEimup>ayS390VI2`{BWxFVP4hj!;C<`BAHVV1NTE3EhS zGpf7Pg)^*JU7VU4CE3dj#siGPmj1Bh&d7Xm?}6J|PH#VMyhGS8*M!{~3oSo9r}d6p z8u9+F9;IkXkyA4@caFC5bG&UrbstiP^vRvXqp!6Xn){8vQ!{qFZw_NkTfXksz{bwS zAo~yO(a+1MZ5VbWM<)hi#K(*@e7ig6uAKjl$_g)F4yg_vXt8ls<8JfxPMa{OZaiW> zXG;}->hpX*946#*_NLaKo)f&EF!*>KoT#YfHeYw;YmPeZBd_(LH9!1qyqYDno!MGJ z=HVWp%*drFQ?w9h{TWWPjdN<>WtaK?auuS2aJmOhC>K$SMm19F!|QNf-NxpD^zxh$ zJ-6bQ>g1CloR|*=^_1*)OdmtLil{qhD_P#>8jm=;&K^xBP?loz_%42i5cl)a5Y_H8 z1U0;e9vK}K7ss6C3vPXS6jDV=Vb#qx7?AmVs?aL_4&HmzJL<-A1U_E)Oi=WAHru2H-O4+W;DcNZ<6IMzd$vJ4?+G2Lovf(bT3RJb-=E8U zZ}e9nUC;@A^!XXMW#)j0<>$MP1L|aw2!kA8Y|G)Z-Dec4(N$os(Kt*lD=rb#zzx2# zd>VU(-$odw_Kjy;A2(y`+Y1cmCMbmmOL(tX+QT-6g4TKGu<%1|ul*OXlp}3bg4Oo- zrJknrtk3gSvgJFh>vmDaxyl%*Y3jRIRfZjtC)LoW%5m#HDeMcFm@v$DqR>FeIt$1O zekuF&ykaJ)ruJdnRWn>l<&71QCiAJFsC2t1SH(@UY0ql{FYqDs^XeYPi*X~2Xi2*g zZYx}exk0$|eNpj{D-=0%f|i}8Ct5xBm*6Y4mQkTHwrbheKKFTo;F_>|o!ZI@k5lRb zjR&f<_rW9DP1_>mhiksM&NbN86!vECs@5Robys#XpUfW-E`~uZE`W$XGT$F@KtY4s z6AgM9BXndfwuHWqdJ1)-ro?ves^S>Y6 z&FwJ-y-Y>SMWcR!r?s~!<|8G57tf(UoJ#Qd z{#Rs34pl2Q6hbB0XlI|Ma^`4kE&K8Uzr9z0T*9*eT&jVPJF!MO-7e%*xtyk%azGe= zetdnMKefRk@^%(ixsbq0TT`v6HW6V{r-SWn%SE`6nz7fqLiQo#>^Dgt*O~0|R4d)A z5?r_RqV-AvVRs2L3!F=%M3vvSOrNOAb)tS!38d%bQR%m)^OgLE-iVXNELYGlV3Ldr#M`q?tRE55g#Am)mE;<{=YRkF zAF_tKx0#ing>U_9Y293Mb@hR%Z*T8FI1zOMZEbC;r>Cc-*JJ-v0-3?vKiB8&of_`f zmG0K)s$){q(xBW?90vV@AUF8$(i=!`fg93OMa7-zMmrQG^|n**`UkszE`x13MZZ1q z;Nc>3V1|Z<`(UjtEi44V_s~?ZGoEUgg`;NER=CWAl3iY$51tnNmMY%^RrnlP=f*Y!cVV^Q=HVhA(JxwD||gu$gdEx0gT{02X3@Y_gWj52`ZAt)5B-Vj_KgxMa5bK!91O_Z@ zx?b*(@-_dIl$4qQ^7{FRx`56Q_k+^9*D7I4#`Hj^jG(DJN^ECB@Frj!Dg`Y_JiQIG zdK#|K*M?Vm5xO>Q<9%JJwNE(NZ}TL*Do}EX)Y+ldd39`p4eMsY3)%kFUnjXkpW-cT zYw#@0DK7Ydq#pVa792Io-W-|xl_6&tGf_ZhJ}2mt#EbF#w7ESW3FwKSCV>^Mty9mv z>!+JGUU;(QL!SZo40yjn$-N5K%7;Mdb`m3=VGC_FjO5z1{Q{i(NOcV0(L@dAWiO7@6@@PfY!ho-w65u%cDTI zj5F6h?^vI=LyD~I&^UhH7Q0oLda{n8>s)dN^+m3QWr>5*Uq+9yVQJGvWTjHj#DWi` z-#;)Sf}g|XP~jLN@^FGh$MJ>wQmHXte_ZSP1TaJW(L>H| z$Ba76yI=bc+Cd7M?^hX(b%aFDe1D(Y&jUa)G`q%)P-3s(hTk}YA|Cvr`_ru3^qnrg zE1LW4BIk+q^Y!LFK;;G`ceoo3iAY^}2+b^EZ&=C%UasfNZzIw9vfO%2|!PkO-1roA0K7u}#M0T^Z6Q3@^3##1|K2O#>8%e3Hh}$#~ zWQkhHW|=7e9QNIh)ou4PKUxmI*oTd-8I>JMBFew7mN;leJ==D%Ei!RRw?K$G#fW+~ zl?g#$(v@65%w+D&5^oN(M@V2EfsK8wLi%ahgxaFp1u3F)5%o>o0FWTgYYR0C@9f5p zG~iSfSCmolTTVRl>`{GgRz3T6ide#h+siR$&m`WRyD>Y^0Y#so_2!8^IN}pAtP7V1 z=y-a#xL!KuKQtcfQn}ea++j`OP0*Hb0OrPd`o+pAbLP9{w{(t%IP)Y1%k}*=GzH zKrQdJK(VuZwW^~?Uq`R2;-@S!R8yPd3NMAV4_=fL=2`sdHrTeNPe58zj<8e z5UPOja72cEvQcnhO0)78)k9KOy_=ULD7vn@cr)tss|d2QCf}p50vGV1W1xDfVO-WR zLH`sT+u{$oa`kQkHe+sw7Qblzyp2Fl40<^y*oBajHysEMqvRz zeQiVgrRp{Vd}4-6oPogql9k(q`3J&~xpx?`kc)BPg!<>rW~)#u@rC20#0-=Q-0#ac zmYXV1a>yOX(OB9oHF*XacumRH)PW~SfxPO62NAhZN6Wli^t$dOb?t~4J)N%lx}2im z^nRly%P&*NnpyCsSCCPGPI_60`ZLSsmS7~4_r*v1Y;0_b!ENm~j@T>YRr$iHwGZV- z5S6a;ZKCyA0)AyRJ85<&R6pu>ZF*y%QN+AgtcM8ONrZG~&egn2f0w>Iu4f|vUh-^0 z*3fPLRGR02cchhD#>|E8fH!z*3u&`s6;rq~0N&ECMnM-$={8#Fd5 z3vo`QpW@OHwJ_P^=_Xf$AlF;}UjzG$qeuNPx$Q2(o z)~Zs;!~a6#L|X{{VsaWA;~-U2)FtdHu0{d*z=02f0)`;xkjflwBwV)HO!{@}ET_sJ ziT{9{2N?_`Ev0Mdg`KyJ8FzQ>oJ0rcHWP=F5_?NNl?2oDdKX+OTdbK^AcYJ8ym$S9 z<;0z@76{b6*npcI4f={G`!niI&C!Yl&CzmgMRlo`=gSM;imHh-69u45AAR~1{06O{ z`I*{$1Yrhyb3Td?;jZT?LM*L2=WFutXHK$9$$qN*_VBeZ<0G|ltT94>TLCR9CjJek zS1#MjY5Zb!g>Vl`kj(v-p9o5QAs{D$3!$4PA~7Yy9}4zzcm$v_&o{0?`lyL3Fo z$DSL@cjfYOSpRt8Fw}Qj0(dGq(*gE+By|rV_ylWa8?_Os^qyat1S#HY%( zR{aBkMGO=3YBFYL+B03|c=(^{Gtdqr3NkS6dg4faNqppkave*cguMJB8^AooSEkCp z2iBs65%CrSSv=t-q{`51P&1Hm@!kIPvq`WViW)t!Pgwg+(kdB4diFAwEE`D~@UQ2% z2%xsl<`3r=TTC6+{BKtgsk%*RYoO;_xS|I?i#-7 zWtD*m>+i_Q)cqGof93QpRODQKQLM?^evalNGP6Z#5>mm3)TOc5OE(agdK@MJw7X6B z3Waa3oUEZuv@E#s+*9Gg^cN?D=G37?m^;x`8S^-4R@N9RbhuGb2TgNfhC)|F;0#I= z%KjA3I^6>{8nydOCGl@u#A_kY=)jG?Ll-f}Lr6CLtlkCXDuLiq+Ro}Jp*Q5@NYkB> zu&v?{LS+I!W*iBp&G3P-Er(C9N}$a0p=3WBoQ3z;Q-yRbmC2CG!O7W+b*UCp!R@c- zGk}U%m>SNRplqcseO*YJ%}+&n@(CNdi#id((|4LKwUdY@8%j#*nHFP^cAIVAWDw<%)ol_DRTtIyd_29=^FCTWTFY88lX!Axj>U0+)FToXqO z%Vb$wDvMXmzeG*?_6PK?4~|~;HIJ$C7%eRB-FVVN`HwAb)vD99qy(+Hv2;)4m|6OC z32&f)ZpX5I(zgX}%e=tkoQimXjxvI%70bCwv*^3Gp9v=GW4<(?i$a!0YA!)fkJPJ6v*f$Cp9m(?W4^Q!c=gb~wc5r;V>=(_ z2H1n314J$AqO}D%>9LO?eI&`QSN_4q<;AnDx^2CII{PaF+{whguZi3_$aCU;V(x(Qy7yFx76;?%%&PsU zZmhwaen>)bU>A%l;>sk@`W=YIrOC@X01(3r7X!zKmYy#N(DM=HQ|3C*yS=1h-*xNO z8AhExQHf{D)r>g6){?x8?#;{$HbNAm^f&Ha0j~i;RZa^VQijY~DxqHK&FN`%O8xB0 zNjfh$U6;21X=QYDrL+$D5rP5OVi&^}Ya61^ByGr6$7PI}AKWw^Qh(uubpKG;&2_r? zo55m4>HxCkHhMwek>YVeEowGS)wuVmKd9*H^4<@?QCsA7VK6ZS_c1uobBRgC>*p_^ zdLi3D(wnTP5}4w!vt|u4*YO*-{>F+CP5cS`)Slo=o6`1-b8LadpdnohdCdSA@vP$$ zCC&+hPqDsHx#D~82cF7adX7vTs2d+2U+1lSsASowCBT^a?|7U%c?Es}^x=1D_S|I# zU?Kwbr`g0C|60CV6S!M~YNTs8$x5!or~mus|By9GD>Bsea&_JNr0E;AY}Hn-q<;`m z*DnP42F&vEay6Y(`dO$O*Z=ytKHomxQhG$;9bGAbY+-4M6U?>2U>3CK>rz-2xZ#V1 zxZC@@>f_ip987!w0s0_?_@jg}&7jcbWmg#-SKT5JU)TQN<oU2V~0D!fBJ<-76O7iPQFXEn@s| z@*{O_cy20aq8Y0Nn~||&JpxTi_zpxonq-BtoP8sy?}Fj=7o=HvCQwC>Ha`WX?4V;3 zs?Su-Q@x3F#e?SOI2Dl6tv`*_sQz)SmG_NvVYjvJaL}k;5to6%#Lb zrSWvz9;cnj61=g)#4z79q=^kN3LB7pu5hHPrKQDn8V&-i{Qtt{7Y&hSxY}~fdnKv0GY@Dy&}KN=DU=v1J&qs$Gnm7LFgbWiXqAiK zLgehwC$$1Pbpe(o0G*J2grY4@7hig z1)SRFr<-0b{cY+0L6-1CK=zdM?9LgsG`Gx%78pi zG-la=-4sZj5#*O8F!a*mWeWN{YwYbEFsy^wHW8{pSKYSvXJp(4a=LhMPUdMdU^+fGJnsJF5nJ*VKj0e79jo`TP5mxvpBy4u$e~hkJ`q`qnXNtMWlg z(VrLSipUS7PW^M6>jHM`i8H!`u)OFHs+>v8kRyG>DcnkPQ)q4Y zT*`Bf!opl*Axg1Yx2j9{DMnhI|1Do}?KNu=$4j$z#HE;=RW1SD65ifaw~o$*A>a zI?N4N#;sc}qcT3N&1@?71AoqN;av=Mr3$nPqmkiz%-@BZgkST9z_JmDE=)Neli3hb ze0X|_%H9;(#VwjV&6PU0JV-Ld9=wC~zr^L0TrKN9Ch0#GM zf{P%c-TaxV7i9oFH=R0so)OdU0rVR_2ZxWBp^d+%R0GS)*kMJN@0|U%J*0PIY&Cm^ zRo_JOQ&GQTdEA7^e-H^*_3MgCx>lv-6ftcZSykDM z-m_2&`$W(UZss8BU?}#&D)2U`s~+zH+SRX>qK=WW9P1bd6;b7Oy>0rJy{BEc1M@Nm znv}Dqnmww(Wq%%TGH(xm3{<5NdHJXmam*JU>Ip$MMv6w>-P(-m4%c18d5k#d>^2y6 zB54UJ2!kF4XgHpD{^02~9Ec1M4jf`FrazvoUh4ahNU$Mochb>Ro_KrK=eN4KKhA^udM0ic zUAmVWLTDE)gb6DAdl}H`1Ij?-CR=Lm9~eoc3R*CloaP~Pu zuO{CU1L{Btd;7R&dB5S5Ne_~yE+16|no?%k;%09;nAy&Ay>$N4ie~hgAOJ5p!?~fN zwI#God%B`dU8_CpAXEPvmFWRrTSViC9#`Q#*zrCvJ5I{u=6<}ONJkTN z@aUu7C5OLRe3M+^OAcSsymRLIip--0TPX0YTL)1THp=GtBOYR|_QvpXRno7Ye4HEx`1jCOxrfcShNb^&3Ei@YdCc!}9p z+tV*C_{v~a*r!gEk&KSxf+A&;5y%RBip;$+oBckc&F}Nlx*4q^x5F9dbPEM$!V*Cg z(6?Ce!cqXx`Lzket#2=cxXiU~bT*hd4NkoDB-dZl3^KirHG1d0e714a;`DA6W+LBh zoLgOiuk#@{!9gqhJwwu{l>erDI(Xygmf5#0(V5&$CETXr?@R8f`sSY$3e*Fx9qkTC z&+cQ8e`{+>=FA)Yo)89ELDu+W{J|+X7bqbQw*r_42Lt5)*N?i9(RHWQu5~P-UlG>_ z_QebX85c_Hcf!6VwLnr(W&*l@TGAz%Cu*|-M7fvY?OKyL0swa?wHD5H*#mSC#s7B2 zFaSDDY`Z*Dm&rS$b`4;sCL`OPx^Ro~s~t-prcH$&{T*m97u(*_ZF zq4RL7JvQo54nkMFs{pD@Vp;N^JPV)$n-#V1d^s)%sKPF|Hdq?>i6j)L z;7hP>POu?kA3Fpgct{hX4!1pa;fgBab_Wgr6=W2PF{E8MBW#!_;#pxrU~J3bv!WL$ zvnnS#ny&NkeuYfY6n1?`P4D#(UTMFDS}4)WC8AyMkRocWjo|pi`l9^=XL((%ByHhV zH`UMDCCZ|!x~+38bo2_Q*oi${r6Yi!u1~Ta=?L2IK{_T!j|KkK zltScN_}Ft6qW3;TsT4ye4Yh^u^VpgJgO{D!M?DU%q`l+;ZR7)Y#NKzXv4Lw!5G0pO zaFFSOzNdjCML)|@v=hI9q_bWg5v@LpwREj*56RDch>_)gfiCE>^${SV$xs{Fz0cJPweVLIzC7++p^H=sDNJxGc+V&Pe)ofL&B)S(@BV4(e$vSEGmwZP0K( z--zw*2|p7;;L(q$kT0fQp0p@;NCVb$e(wGFhfe)MImk6S);DTjF5~Q}%2fZk&-?$u z!O(dCFcDM|LMPdG#yQR3>5Y}_uCv}9Na50gAeK_JKV?miq$x2WH+hD(k|}~r6-?eR zZ~vg2CZP-CX~@#fw4LL^4+V%C&toOc_lW(rS}oZNbKWUf_UxYRm9D_!6lr?CK>%Bzt%Q1?6%bCUzz@{?QUx=W z8n(5oNHB!_4Hw0H>Wo>MY3$E%A^74KuG_G|P4-78aFOCjnI;4qNK+lpE$;w83{#1! z4h}@06`)`dbxzzpN|56SMt7y8%S-wrvzN+=cAYDPtcL5Py<3zpme-M#?`>Fy*M87z zu;zw61~zD_@1KZHztJL#krMvdJYklb<(5yq_4OB4OcV&g0BrFjpul{8O$w56*E+${ zYCb#hUa+D2L1_bB0!heuky^@ zWm?5@gUghZiCtW$Z>Y_mtX)lhk$wUzMc{4;s`2Gnk>n!d`ssiF{2#K0;{~hDDV<7( zrhcYxnZ8c4u|N6;0PR8a`SWK^PfyP#r7YzRX#H!c-(CE;*71e>cYlQ@cy4ZPn@}R8 z$Ys?ZktRUE4PLnzrj9!Jrktr;t2Zr=+ zCTIQlC=zIMFS|_UUX9}%2~*$r2&$)DXPZ7rvNyQ3*)pR091E-3W%}`m1s&fNi!<{N zjpMnd1WUO&H#}9)D#saa#^S!c8vXLq|2MH+{)9b-)r<1`!<3MMTiA#GR#(}2tJ|E zHz(x(2aTjff;W1nr*`cy9Oi;mjizNj%fFzFjErb5;^hD<(*Vk@`SPo;-cmPO)Tt-U z9$;X$JVqq57F%N43+>b24 z4A<6wPQ?BeH~&<(gce4*Gg0>aAedM|cdHGX$q$9<>jUKT5^QmyT@1DGcofcmU9hxO z`2i@94>OIlsr5a3Xcu~oFEhqda&)$VtI1lrJ}K+G$$I@ce5MIuH<{QS#DL4BY3I}1+$UKM3*?oX$$Rn!-+`yg)D(=VvMx+0w5%(VlE#0M%r=5`0-PMw(2h;i!6+rqvO|aBuafX)VTyz zHm&UC$j2Hiwm&4(ll0d`2fAlM);+9?xsSvxXM)HQ#xdRNWXhJV_QXW_9 z;F_11MazT2?c_QOwO=5n%psG<_&ZXEXVbNm3Xf++eV#B1-vRDdmS!Opj#K5Wh1u%V z%vMs0V*+-o@ntgIXodlhHyC!pRONyw??xnx=|jY4d%+tOm4o@isN85aW#8-Zwc_Q* zY91UQ92A{TH`Hor7?dq~+z75jZ@yJeYg4Ija4akfRcSa}*%gJ)%Bs5|w zGAHV8n*#j9S?;UtlBQHfl6bgc>JDdYN%OG!;T6s3Y=Bb|k{wb12z$R~^!Kn{w*;(L zZ6YUSnu#peTHVcxzu*nI`n z%@lV7N2*Q@!?~r*KRhR!;9I6aCp;t=J0Qxt40;+TxFRe;&Rm*6+!fuE$Vi5jUj|RN znBksnygwT_aBCuPpkCWIV007Ei!Q~K_}3CA8uEJ2RS6Ua2or(BYwFSvOM7-2alfFO2aOt%%>XanT9|u#DW*de8nyW35z-umpBK3FQr#-y!+5zB z{{Ev;88iLx4}*JiYkA*B>e~ftsFA~g*U_b|DcM8vb_x2gw=?y>SWmIxcRjDRL`0t0u??C$p2q&|G_Wabi^A?c60?Doobi`GA( z?&|wcsJnTX`>_Q5#S!$Hm=NZQ$i1J)ew_IrD6eyXI*vNP)N`%G9lF)S;OG9-50EQ4Q6_Cy#anhD z@NsI?|KwQ!JymPc=DeP^qd*l_Tr!ZW>W`67pbTC?m=VNOc0y@@zF^QJs{M^08 zve>scLVm~>wY>Nv3n3?yg=6o)-U~rHt9K5cb497?7Dfn6;y;ic*+UjmlSG%gLa|jd zuZqTk%D1khz1RX%PJAn_c-w4N{R>qOUebQ2dWRrIJ5`dR=Pbk)V7`IBES%piUX|0F ztJ&{W)7ANbEQ9ib0FM&ZM)Hkax(``ES8B$pQ8=YixxJI!uG= zze;F7dacgxl`9~eRumy-_{$?0*TQI>Pd94T;I1VJ`KcHtTD%-!rAe!F5WLRkg02>B z=d{&{jb(-jTp&#?k~ZP)dI2$PJ;}x3C@e=vg4FdF2{t|iXAlCIy%JR|{HYa-$*(Wr zQR4pAQnI`hC1EVDW;}d%cg4^p^qS`ER6pP&Fm;mvDtVB-T95;v=|fxNbMIe4xUZnJ zOUO6?Y?1m=pR(r}y@eQX98fW<^R1hY6IDtRm-i0q%~EVXoybaY9m0PEz|C z+*0PrI6@Xp)_0i>A%UZAnYOgGi5u1aOzrz!%;zxA6`*hnpbxUr1VN%3dUNJ;VzWPe zpZ%iop_L;deg^1DYf``7^gJD53@nDh05hc(T(?#{z0Z2J{05OF~XmmoLr;Oq2LX1@B8U@ zjfbwRK42kty-I!<56F^6MN4ySaX_D9`_Ba|xuK$yj8sYh4Sk;*ZG!>Q`xV5Fge|)| z4v2%=<^c(a+HfOqyg*$`h{A_de$S#RbP-My_6m(!zCvh z;5`f2CjLbfnwJclsu!88yJB%#J>8Pgxr3G)9ge3mQKQlP+2LkOBNMxtLD?Fh-bre(#Zr6eyZ}x{JFjdAnDQ2dFMxZ33P2ZKsZ3d6lralbBt5v|@Y=Ft zwo2}s(!Moctb^kS07seuDG*cc)7<O-y#RR&%1I$RXP_wa3L6LMiA+jo^DH&ML19{h67Hm^wUixN|xu&qo(7g*$ui+ z2!({}#M*g46@sRB1J&I#)CqKAu}C9E{B(eAn}hr0+!iPQ&~td@TKd__69hE$|Kr>Zk7iCOI3m4TINq6S zsPh{z*G*|02e}0kx*O{)?HoWRV$7370C^*>V^C(9UU;)r=`E@QK&VZW;{n_=1;)xagZ=-VRRCz zsv{~MyKwy&YAU~tRH5P}WqoZp3UmrL^YUK+VvB2BqZ>vx)bt}EeAu6LF6#?N9>*~a#CanleC;2qkvBy9{T;%Xd z)B}3?6r;t?!Bxv;lvmlCyx9XZxpH*}^jB9ZN7U@&?&|hw<8?s9;nLe^>Fun{VHAlN zUZt+Szt##kf_Ew$V~xlTp-i)M1wR20lB|Y9FR#HLzg0bTn)W+*6-KQCrgh-J@Qub{QNMqYtDMmPW=hp?2$*hj?u^dp)#UI#A;zyK z*IIIF+P4n~$HL&v^z6j?m4Xsopj}-ek9(}O&z>FHY{u|=wlLS?sANPnK4L5rJ1d_r zDC=Rx6#e>S);d^q2&hU`eS8=r;vKjAw&ooOTO7V1dYtlms~$HS9I_MjxHT~Ri{eAOUDi+!WSY@q5L*i4{ogY@tP_}4 zo{Vz`n#^O!H!fhNL)bb(y7)J_`z5O1K}*Gvz|M#xi9z@X1TH2 zr3DZUC>fiK{_ zWvSVGyF$TnpVZtxFcQ}p*qulpp90Reqe{Ou7RYi!Sj^v4^3 zpzlU+YhBI}I6jgzrP@D>121sjMg*g=+Y(kbqdO#ciM6qNqxpOK+^|30ULJhk=a5Q~ zZ!(=-?BP^p)M-uA?Rn-;J3&h;Bslq`PG06jih&eh#i17B;}RLk?8Ea0iz69rXV#d7 zADupiJbG;)sj_NrjgLL@E6hRP&6VSB%gUh%*Ijc)R?h;5JL!p@K2B@12Y(*8+6Wa})g03GOc4z8(*{6Pm6WIm99Li5IZwD#{2#U z&*B2mQ{4w&+ci1*BH(zwy~DH(xC$nrK&5_-LmJatLz`+`Y3RWa4E(e9AJjS+Yw)8B z@5}bK?~GPLqBZ7F-ITAP8yOgzbf4Hz3@8we6%#80T|^qR2_jjL9YZe(dEp8zs_Oid zs;Pu^11jQ5vbIFM`aKy!gW5nV%h_kix3HkO2h7_Tr-yS8F^QHWk9Rz(=lwTJ znyum3rmoZ5BWrfIpo72P(GgTX?t46&Q$mVQwyQ&>pS}z~SqK)ip2ZxVsA;AxI@-@y zJFQz0X>|4jQ*Qo->HRjG;qtd{iWYV3t;=I!OH!*OMYj={QOMIEuSoSr7}?HY8^wSM z*9q@I_zh@996)&jj*!v(nI{9j_TxN<+4v*IgwxY^>k>`1ma=$Lb zrLv~Lb^p_v@3B6vzICdn<2vKwMhCNy>E=I6jScMpnMoz=H-oQnlt+vxhtF!`@yNQP zUM|#6DE6izk9oGs!p!99N^xrfLy?xeQf0iM{l@_szxDR$LB5`x9{ybzb)7gf-!f4T za^Vgu!JEeQH(4WcX-4J$>!` z0ZoYHdH3o608-iJSRi%z)^%kP~x&$$0c8~a@{bJP{ zfiwY-rmj5j1BhY3@hGV;Af0GNoLfLQ>fQ&C6|D-1kf>_4KIJVSQSQ{GiIWYA57iDs z0mky+-|Q2Yj{hU5h71gMSP+1Zz)3y}P|1%L##aNHJ|9><)yAw$@6a-({YMA}U<-?( zl!>QJQyz5v3_!)a8I^x^*MB)o;}{5z-&9-D^Q8^V@az0McGFVSo_W&wznsvKE;(dp za8r`S)B}v@c;C~=wA*xN&b`}?pY_fm{eW)p$-~LJRtc~hW_*i z(v<%H`{4s6>i3b}zita20#21=Z`cqX=ij`_@$2H^Vsc20(96eX!lRI4@N$=H>VmAi zLO5^=1aQ!0|K&YbWDlIZ_1eaa#~m6P`bw(`z?`8)n;!4qy=xXY43q1)#z`i1-1C&# z(fwEtPfyJ0fBffZryaXmW<$er7(SJnO*jB?sYzk&|A6rKt)dC$!`11kV<)BKaf@G_ z5dnCKy<)DVVe)yS4mE(>kun{{|kkG$&jrF5Lem zwdM6XikV|0$Dp81zY}c&`?qx@?+0#sw$|^RcGS^yE-Z^BVGdZ$IBTBRGR5QZWra6u zfrFGJ)@(N~Gtpr)$ne5rhWWbyCJ0c4hsb)Y9wkV`VWN<9x<3T48v58ztBsjC?O3ab zTkA*mwf(ckhyH3YHk^N zFCl{P{|%Mw!zK#>B!F=G)yZCwp8@nstn?Y-F5sEAY1gp*1-_*2!-xPEaoAs|#;CPr zHWHP~^)Anoz4G%)KfdJMyR|3DA6Lowe>5AQ=`X`Rt^!yf`DXv8i!*UbGL7SS+LAlbF-?iCuDE04T4p#~ zTA68EtC^Xa0v=0dYJpT%7T^_PI_i#Pq;6RhqL^!9MrC=RX%~4#DtWX~*ot_Y8j1pe z`@HWaHv11e!}~nH_uw<%?Gyt|irWyvJ2PdtL_Y5xP6wA~L9~ z;vs(r)q(*eRK6K({OBN6Y8vtz4YhlB{$_i#Js@uB$QK*XZ`rc2LX)8jv2pWRtc6GXn%{~5^|jf+KT&R0ev0gPmliY92BOS(mQs*!2jv~O>^fFr|)5xWCe zr#_2Kfts{H{e@Mrn5{not20v4(?g)&;&Y|ti3`O5BtW>P35tHv&(>eISbt?C{PZbN z;E<`JU0H~a9xIDLN6=`>fm=Pqv4J~Ey01pLiRvN0D(#sJ6(cs76NyA!nX3n6Cao6< zIiE~|md!t$*0Su{N_Vu-!cg+&mChqo(z!#%U03XbtzIMKy<*d?;tHP*23tK>5MCo) zSL*=?34PkdrbZl{RHT0txMd^avogZmnn1gy3d(rFX7oY!XZPb+k$S|UTIH)%^hd6 zOcb!WV-M)IOlq%Ie7jI&L2c`H#!6lLt1mpFTST5*(-HdNuauCnlo=kfGn?{!xV+vL zGI!i{x|(<&Hg`0;!`+rRPG>aeww!aEA94>jq@3QRN?6}KeY^bl>IA|c{viU@j{@hlHasg&J zImygP2oLAVo}a}5K$5H`L4d?BOp29QGn9^(KaF(vzr{jcQjG&~`%8cD-}1;~qApNe z1Mk48rk`VkrJm+}Ay_odcCy5;;)0#ROJ&SOxC5tBJ8i z3oA-KDq}AKK(e!}@6UeF4r5H3y=A{dpnlWe%7b1CSM%HEwOGrf6(>&A0d zSm(KyNlHPMJ1NFrFxniJbS!LS8BR)C?)6U}H9B_Da!Tvha!V8AU8+ANXeg}Yq4sDd z{X+zZe{gf|&(UU&c9PuamfkT{Q2b*BURbv_YVkL_7ip~k>JFZI>caashi#zOdf^K7 zN)tH#fmvkSlE;lt9yrs17@EPX^$%6MI2W1_FplO|{AO^>L>TLy zr7a4*pkKwWQsIiUO9x`oT{i=>EhABvq|9wn3@j#f-Dq8T&^<1t<-Tg^M!8Ox5*yHU zvADt0ulM*Z6|SKvVc7!*&hWN4=B}&#SPPr+UmC^dc(R^N<8wv^IqR|wHLFC>XQQXP LkK5hdhm-#W!juN3 literal 0 HcmV?d00001 diff --git a/test_output/3_low_density.png b/test_output/3_low_density.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0abe1b43257b0bd0f7103e9e77599848990e10 GIT binary patch literal 13012 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 z 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 VD}fiU`Mw~y*d2*6&7U7Q^)LTI(;ol; literal 0 HcmV?d00001 diff --git a/test_output/5_position_bottom_right.png b/test_output/5_position_bottom_right.png new file mode 100644 index 0000000000000000000000000000000000000000..abe1bdb5f970c4ec66e4d379e0d73774e89f6b6d GIT binary patch literal 3650 zcmeHK{ae!K8fTqaYh9byX*Hb_-Oh6EtvoJK$+w;5QZud8rKUzjWr}D@hziJ7JL_yE zY-XAoe%I#948$P;DFWNtaLs_0%G+0=$q5bof-ea2e%N-d?VRg6f5Ex>;rZctez@=F z^K#$MbAPlyEA^=-gP(-KU{9r|rDVfkkA31_Z#?n1{{-Sc_!b6xdP923-*RgYL(>jR zc}em5(@gHM{xAQ5XMFrhkmf?@l%$+BlKYYwet z@5ZwBY+mzP#b=+EnS8mxtgNltNjg~vw0Z9b47@yWhoF_u7MMvy*&Tumxg)aPrY=FP zg=JiZ!8V1%-b>j4d*Q$uSX%R=?ISiGnc@Go7V;~EhkceL#-x#=fs*;)Xh&?aO@#)M zY+;i6(q-F0mmRV_GY)~4q1jIP^Z{bdz;m++U5y0O5INPf4kM~voEZqvi%86enxJIF zfXO3i@77$gz{N5nev9@tgG`|Cqj+o2C@9ZL@?=L=kp57&p07B*@iI9Bi0_jxq8 z0+QWow6D**rQdu@Dsa|%ZugW(Ck?x#tx{9rG(YQk?=)oNVU#Sgv7WO-XWs0T$6Dca zAkuTjjGk>v%;6SFob0XrWS3iht7(2XnY8w0nK##Ig19aBWSbH3MLhlV$r_01Y~*rsElzUfNP5Yp-hm8T@X(U zCTk7|aPVz~_Pn848~wxuWrA#6ql@C8yyED3ixXzcD;{s?{ zK}ay>OA{qLfumhq%bu)pil;SU!OO>~Y{TDIJ)t>%z^)is0g-|lRwf|imSGc1o{!aj zTPs(UuqHLqIub_z&W4o+OF zDs0eCct;`}c3_RFzPCbzITYN7v$CWDK75n2Oh;NcS zs+KfET3O3PxZnKdyAmXwZcPD^UghQ2^F;Mp#h`tqA#dQYXNj$w`cpu{!WLl#SATzQ z>KZ=ek}Z)SO*EBkSpj+HJdH=^1NiRmA0BG)Yc*!MqR}CFQ1vNhf%KN}B(X-D{c}hv z=C?EzN{QO6n?QB*=`$!E;5$QFnsXK&66&T2I!^%_{Hr3P2l=#UrCt{yh+CwN|P8-I9A3tdHbrnx!=1}KCfE&VzS3{3;5{Zst@ zbj9FAoVgx1rMFEQoHSEqejQK7c9`=;5V;AhJ8-D=mB&sG7e8N;T-XN~ zGyyRKF?sQ*GDKvkGcj>xnz+uIOSqM5x2j?$F5|oIiDp@K@uT&_F+D^5x=NZHRE)FF zzMAX@#M7G>%rQQU#JQ^p!HQ85LdZ;8`X9=uBx)ed`TC-F523+WCa)LYM`y9Z0_XOn z{HLR8s4e0lA8B#sdkbJr771Bfi^sC{H$7#m4U~i{K+ve>gy%MG^Q)BpmHDLyW4brn zQRP9hsv9TMi$7oc^~0t{4#aGzy6!R;h-rJ(84~AFH+}S(-M4qz(tl$Kq#3Vxm*(=$ z+A+IX;_Q8XPsN#Eq9rV~LEaoG8VyD1{Vl=QbJ%{5-A`#w!}u;KY-}jsBwhK79RA(D z-vMn`$APk$cZEIENjt}Qz@?Rs*$pgUF?td{QX5$?n)HiK7(e1Vl8q&*GRdKD1_ zVpAZ9AW(lz(b8weqrsv-E=eDuZlnd0iTR$uLdoAmrwbD#oi4? z)n*Qq@>@rF$C+fuy?^^RBSxlZ0CVjD944?^BMzLoe_qYCrRH^tKxThSUnu7 zB<~Bz+tK5G7Y(pbAMi9Isg#8+lvaP}@LwJ(5_QE&ewG{&ujs-Q9Mj$O5RpB2_mYYy z7y1AD^8iprIbI$gqY#lwrA@;r{+7|}8QY5&k>)^Dw~g_cP8^zLpYL_^ zc)Cgl7k@fR!^VdUc3F`A>qiOumGZMrA^YXxu}v-sRz0TZVB7`blkj)^SxnM(mz4)Q zXr*;(l@|EG-uMUo(aV)v%SCk^1F^k5T1^FI#4%To8#ds27i5XnySo6T##_ckVrFd( zjqix-$y~?jZvt$V@*vkmgXxqt5zeyJw;7YxXY~qd z6bon~{t#y<^38wsFlR$&5!NeSRhAYfM=Pj$^PzDSk71b7S(5&1rnv88EP7nw5_TNw fe@|WRu-7(K-F!uUG0#66!qVT#N@2ZyjA2wru@Q%%jO=x;$HFVukt^+2c3r!6N%XCX$M_#U`T0A|@~kMcNnu;+c;b9{ z>fnR-vVZY7c$-5JynFEM8P0TvKkquKWrj4Nb$#Ai%W;YK+l<8}N3!Krd~H?Vy?gh( z3A_ch!n*d*uku6rVWij+X}!jO?GPVW?nRu;#nWz3-~jADnYaPT zW*jYWYzIb~`%(6Vn+F3vUe(HmX~i)ArhoSAVylL&7tySD4iE?#55y^;EZu&JX{ywH z!j6vmD?5+uhzeTbJ9zfyHiSzYv@1X^pg#)@Gl(wdZ4-(hPY?uh=)`W_{Cr&)Z%E5r zxO=DDdl4DJDz!}VGL|&V8|`y5%53%}!z&BaO%$#n$j^HRg8&B-h9}aZQY2O+fZTW`dhUy&$!7TVxKM-em5Lu6A zcA3+N%D@a*q21&E!aGE;Bs8KfAq29DT;haMN;pjPE$1~SkUD(=&kSc4rBR?C{Ebuy zVYHZr>L#2eF-**gDT&m_v!g{LUV&0F%1t>I-ZJ5wKt-n14FvhZG!4_gvr0xgH^2>B zRU=x8t}_*a^kxdHtm2M2w$shfsY|;7b55H8NsuM8$48G`s4nOpD+veTDRQA)%PxD^ z6STC?mw?ZQOZTfr65wP`?b8OkG0P&Pnj4Mx%DcVP`cKW#a) znA^@~j#PL?h=V{m!*4*4M)p*yX*Q-cIS~`3a|^_+lDcTj`xRQvC53}id*MhZ?76db zkJl(_(7^pFVCgwXZnYWP$tYig-W{^e<|q+a2eid$vQ0_KFAh@x{X?`{t*{}T2PC@z zUBK1u>zPE~?2&laX7Xf?S&%&Js(h;Se+)y)18t;zF;-ccTt8c$HXZ)u&&NJ=VF(ba zy&PP5RP6lbC2=F&xyHD~vjsKYun_q-i7af8TeS;=?Q=h*utNUvMJc|$&4c5bV-r-vvJDtVe`~~_E)MkLMo%O+Ee?|FaMF`&`W$9(0}zXZH%AG=l1|W z_s*n!+c`6bdS#-htC0TL{kYiPMzdSdshTRc)v74WP4YbjQ{cyeyXmoose$MWS>W}t zCwTIs-!+=VH9fkmg>sB58nMXBH z%+wBxy;m;tKSzy!&%RJC8aZ#&uId8$7Qu^lv}ppZHl!RAHYW=$G?XJT*``%iJ@&Q$ zU?{gF3jg~M2|Tic3vKc}8{muarfK5Ai}j!A8Q0RGy8Z)>P0mu(&6en**4h>8IH z&zM;LZ}~Tcvdsmu%v77_x!TFjeLF+$T}a!Jv}Zd<f#VUjEDDAwGoIx;TgMz-XC7B52ULHn{Qe(sZ zBT{Fncar~*NYoZfBS`u_GFcbM`CyV1>K`-Co`=>nlNUwJv4QE{4bchqc_l^5qPex< z(e~4$GaXPVl?J0~qrjuaV^}GbRqNhGP+S(iwO#wCsyPXH{qf45jj{v0lHF2mU~%;| zZyNS;iJfW-pRxKa^kQetoYKb9f{c`!OfyQ-ZF133YBEU?+4TidL^{rN z+_J`eS_pTKrB2ob43-hZ&zoBY+;KlZ zb0DktKp>}*Zu0m(Ph~F@l#uot!F)>#3LPCz=|lfy%ZZPO8Bw} z(EjM`GMK6;KmRq|qNOsLo6D{UThj5Gu>z0HW{U(JyRc-wQZtfgz#B|pKA%#|cUKo1 zECwJD&{1>>Hja?ZH6ClmC0>xz7|;|)-#kk}{kCFke-e4FP~H3zV_j%!o$QC-LR3m;2^MiM0IJ(YQ3cZ*7(KQ%B(MvN+dA=Hi6LQ zIb|5F^etkt9Nmdokk#KB_TdCVLPFF{S&9^Y#KcF>W*0w!8LjIBcv{EiRUd*^5^GgQ zqml1YMbPn)Tx({wwc7JZVLLaVToxczY3^(VX6i9J^<>q=K6C-q6 zIPP1Nh4%I?`AY3cv7M$I_3mRMQl9$5Wg(RR_xf!IgU?S21`YxzP}6!`oP*Em>+55T zrt_&DH$2TlQ=Rf_RQ=Z`l9qaL7>=R$VZK_E+lAtz!NKvpIFHvFv` z|KrPWe=v(xe7(5cj+&6r;VDjd&IrN5Q*ByWn4vS08Bl9ww6a$*<|=MW8KzO$jY2kn z=mG+{K!Bxcei*O?xd!zZ9f5agIm-%ql>*PRdliH{u2D5|PA5&t8~ycFM{RAbu?yjG zn$6}=aD^c!GLYe%d2Bj)_*MWgK&3<+0mm>l0EPizx=MuO64dUeiAJQnBb|)oQ{qkE z7Yy~NTwS~&#F|?S)_6Z0`LklF4Yd5^>BgLg9YqPUX?9kOam9o&G6G1`tN0{iv@FFR zuOVkMpJSdjQG=&%w6wIqruEyOhh3wKgAqs#0gO?GFIUv1aq}n_i^_oauuR~#BY+rf zLtF{o4aiFPV4l$LfTU(Cf+xcEo4>mk;QU)>*IIl~#tW7zSqO^&kbEo_i&?H?vqQz0 z3)D?0tNu<)Q*aTHUzRPcSt1&S9u?0Jf;5;ngroAP0=hHK2OKkI{!MJcZ1-JU)W(2K z4aiIQt)4qvI$Y<|e-{_ggDZS_!3CFjCIqGJa%Eq9TO-lg=R+^!emOe-ud@qVihw?8 zSI9({R9@1nlly!9F-(gOUYy-t@$$Vi9%m-$a%X8fSAX}%`2>2Ff&%)|5&pQSe)+*! z`0iAS?fTbs-pz{lV!VCS0lRa4mh4_0%%80c;ToApw2Z_cOW+_XSDP{EQ^a~NML{2m zdQSiz6=m0Kl6lok(nrtcjbuqcs3g&HA6b#!MKgb+_ez_$Izg99+riDO~KVS6^D0d?L{Ca0ZxoTb%P943`~D#rY5PDG)o zopgJS&~N;$f98yT?t6ds2*+}OJd}}Bb_{XUJ?YdN4!Gd_PV>7)^v`-uk<F>7d4}(uNgBNNWBodH!+n{{J>>3tUvLkvX2&n!G<(kc3@{u^rzYD*q25LqW3u literal 0 HcmV?d00001 diff --git a/test_output/5_position_top_left.png b/test_output/5_position_top_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e441a592a168555c2c193737b80d4a83c99b2069 GIT binary patch literal 2612 zcmeHJe^Aqh75`Gb&RK<~y;TK6rn{5%v_v5cFhFJjsn>}*J9CmFQG-JbA^ed1APK=v zi7jBZKMKm%kZMoU8X#sgB#;DF5zIw{_>A^ z@9w>K?|t6Sd!HOFEZDp;ej@+?n-6`E_j>?{`STj>+3@k><;nTJ>B4yQZ}2z zwxKY{>i-$w`$Y^8j{!c%{BPK4&}=sQW20%Stohm5*+^i&f)QR_oY)$bINKDH#&+(r zPh_Agd3c313Q?>3Bf)V6nM6=#KWq`wq%LL(oZWpIIXDucxpkwR>THQG^EK@Umzl!{ zP_bg2>ybA68AVebo_&rGKSl@71^joMh5raH&(pR>BeI0_^3^4Q^a*Y|v;r?a%UBf6 z!=s>wVqJ7E&Mhj?w(-6=nWu)$_Dz165Dh=%hHMO|ODM>^D29wS(f&0Q!G5~TE;DjY z(ui4v=I{$Hjg(eSJK0RqGLh7=EEJrlkK7^&%2y&Ok*CLxguVB0&g%8wU%fw?aV~OZ z`|qNA{pjHNToP9N)cMtPYS&V8W$1?rs3C2vc}bL@@kotqL>;gDI`}BOrqQ7*JJ<;S zFO8NQ|5WurMO6s%R5nWA(ut+VHL2|hQ5i|67dDMye!Kg@Zxn+8KirR0)CQl+?Ig=8 zO7JUNdL6sx;!G%+zlU~mAV+XMk3eWxK7DV@9H@k^Mu(_11AGdU2 zC7c~`4`c;Q>)f2_SHt;^w~-4I3CDjS&~~=Un zM`I?sdD#}s9Dd$VfYJHl!|gN9nPw;SC)ZN0+v?v5TCQn42~kqHN!W81@q%TNF=6ZB zH9sG{^m84RDS8t``5dOrTcULydl;AAG(?qaJQb0W6~78DfRwbTNxyIu^f9H%=|8rM zI@DlSDyKd-Z-UIvXwGDHz|=P5U0&-6)HbpA9r2GTEZ)V`o11Yrq3weKYBj5@h-ixp z&A?No6iYJa`q)pxd#|3kp~*r8iC`DUpTaUlziCiiP|}Gdb|#~hs5@*p$&Xau?qzi& z`vLJnFAOG`z2HS|uVa@}HK{=c%A)>b-Ltvs;3(ojD2L~yZYGznI*U&8oF zzs=)suNN1%R5gy+*+vCVVxl8dBm3KakHt!?#MakfeB+6Q^vA`6oFmCA4k3M&p}=YF z*%CD$OVN3*SJ&h+AgcZQd+IHjmKwm4KLO>4&06}(Y6@p6GMv@J^?sKmI^Sfd>vJA^ zl*7j!@AhmJoznK+N@uhV42L)g!7GdeW8cg1v$`tc(S`lJ;iSWn<%_lN&v-Srh9}pygi1nlW;<8r-*+j+XlME zTAv4JLN9JJ!ltc?Wl5kJpyDdwkpvMQ-=EaLcO@| z8j$?fe_i_s>BfM6KoTed^u_Ceb9q4h!B^~630_UX|6>t`B{BMijz%)@7IEzx1Pf?U`aB6b( literal 0 HcmV?d00001 diff --git a/test_output/5_position_top_right.png b/test_output/5_position_top_right.png new file mode 100644 index 0000000000000000000000000000000000000000..59e41e4976f509793ef443985b7a2cc910a142ee GIT binary patch literal 3036 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 E0H^mH*8l(j literal 0 HcmV?d00001 diff --git "a/test_output/6_watermarked_\345\205\254\347\253\2400.png" "b/test_output/6_watermarked_\345\205\254\347\253\2400.png" new file mode 100644 index 0000000000000000000000000000000000000000..141f7896fa27cd3653200fa4fa9e4ef542744cf5 GIT binary patch literal 16044 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 IYvB8T02-TSK>z>% literal 0 HcmV?d00001 diff --git a/test_output/test_watermark_config.properties b/test_output/test_watermark_config.properties new file mode 100644 index 0000000..6686621 --- /dev/null +++ b/test_output/test_watermark_config.properties @@ -0,0 +1,14 @@ +#Watermark Configuration +#Wed Mar 11 17:55:39 CST 2026 +watermark.color.blue=255 +watermark.opacity=0.4 +watermark.rotation=-15.0 +watermark.text=\u6301\u4E45\u5316\u6D4B\u8BD5 +watermark.verticalSpacing=120 +watermark.fontSize=35 +watermark.position=CENTER +watermark.isBold=true +watermark.color.red=255 +watermark.color.green=0 +watermark.fontFamily=\u9ED1\u4F53 +watermark.horizontalSpacing=150