|
@@ -103,7 +103,7 @@ public class ImageUtils {
|
|
|
// 根据图片大小调整字体大小
|
|
|
int fontSize = Math.max(width, height) / 40; // 字体大小为图片较大边长的 1/20
|
|
|
g2d.setFont(new Font("SimHei", Font.BOLD, fontSize));
|
|
|
- g2d.setColor(new Color(255, 255, 255, 128)); // 白色半透明
|
|
|
+// g2d.setColor(new Color(255, 255, 255, 128)); // 白色半透明
|
|
|
|
|
|
// 计算水印文本宽高
|
|
|
FontMetrics fontMetrics = g2d.getFontMetrics();
|
|
@@ -121,12 +121,60 @@ public class ImageUtils {
|
|
|
int y1 = height - textHeight - padding; // 第一行垂直位置
|
|
|
int y2 = height - padding; // 第二行垂直位置
|
|
|
|
|
|
+ // 分析水印区域的背景颜色(取样水印区域的平均颜色)
|
|
|
+ Color averageColor = getAverageColor(image, x1, y1 - textHeight, textWidth1, textHeight + (y2 - y1));
|
|
|
+
|
|
|
+ // 判断背景颜色是否浅色或深色
|
|
|
+ Color watermarkColor = isLightColor(averageColor) ? new Color(0, 0, 0, 180) : new Color(255, 255, 255, 128);
|
|
|
+
|
|
|
+ // 设置水印颜色
|
|
|
+ g2d.setColor(watermarkColor);
|
|
|
+
|
|
|
// 绘制两行水印
|
|
|
g2d.drawString(watermarkText1, x1, y1);
|
|
|
g2d.drawString(watermarkText2, x2, y2);
|
|
|
g2d.dispose();
|
|
|
|
|
|
// 保存处理后的图片
|
|
|
- ImageIO.write(image, "jpg", destFile);
|
|
|
+// ImageIO.write(image, "jpg", destFile);
|
|
|
+ String format = sourceFile.getName().substring(sourceFile.getName().lastIndexOf(".") + 1);
|
|
|
+ ImageIO.write(image, format, destFile);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断颜色是否为浅色
|
|
|
+ *
|
|
|
+ * @param color 颜色
|
|
|
+ * @return true 表示浅色,false 表示深色
|
|
|
+ */
|
|
|
+ private static boolean isLightColor(Color color) {
|
|
|
+ // 使用加权公式计算亮度
|
|
|
+ double brightness = (color.getRed() * 0.299 + color.getGreen() * 0.587 + color.getBlue() * 0.114);
|
|
|
+ return brightness > 128; // 亮度大于128为浅色
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取指定区域的平均颜色
|
|
|
+ *
|
|
|
+ * @param image 图片
|
|
|
+ * @param x 起始横坐标
|
|
|
+ * @param y 起始纵坐标
|
|
|
+ * @param width 区域宽度
|
|
|
+ * @param height 区域高度
|
|
|
+ * @return 平均颜色
|
|
|
+ */
|
|
|
+ private static Color getAverageColor(BufferedImage image, int x, int y, int width, int height) {
|
|
|
+ int r = 0, g = 0, b = 0, count = 0;
|
|
|
+ for (int i = x; i < x + width && i < image.getWidth(); i++) {
|
|
|
+ for (int j = y; j < y + height && j < image.getHeight(); j++) {
|
|
|
+ Color pixelColor = new Color(image.getRGB(i, j));
|
|
|
+ r += pixelColor.getRed();
|
|
|
+ g += pixelColor.getGreen();
|
|
|
+ b += pixelColor.getBlue();
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new Color(r / count, g / count, b / count);
|
|
|
}
|
|
|
}
|