实际问题:
在功能开发中,我们会遇到有关水印的需求,eg:实名认证,在身份证上打上水印等等。
解决思路:
利用文章 二维规则小图形对大图形进行填充,求出最左上坐标 来解决实际问题。
水印图片可以看做是小图形,加水印的图片为大图解决方案
利用Java Graphics2D类来进行图片叠加。附上各种水印位置的工具类
/**
* 添加图片水印
*
* @param srcBufferedImage
* 需要处理的源图片
* @param destFile
* 处理后的图片文件
* @param watermarkFile
* 水印图片文件
* @param watermarkPosition 枚举 水印位置
*
* @param alpha 透明度
*/
public static void imageWatermark(BufferedImage srcBufferedImage,
File destFile, File watermarkFile,
WatermarkPosition watermarkPosition, int alpha) {
try {
int srcWidth = srcBufferedImage.getWidth();
int srcHeight = srcBufferedImage.getHeight();
BufferedImage destBufferedImage = new BufferedImage(srcWidth,
srcHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = destBufferedImage.createGraphics();
graphics2D.setBackground(Color.WHITE);
graphics2D.clearRect(0, 0, srcWidth, srcHeight);
graphics2D.drawImage(srcBufferedImage.getScaledInstance(srcWidth,
srcHeight, Image.SCALE_SMOOTH), 0, 0, null);
if (watermarkFile != null && watermarkFile.exists()
&& watermarkPosition != null
&& watermarkPosition != WatermarkPosition.no) {
BufferedImage watermarkBufferedImage = ImageIO
.read(watermarkFile);
int watermarkImageWidth = watermarkBufferedImage.getWidth();
int watermarkImageHeight = watermarkBufferedImage.getHeight();
graphics2D.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_ATOP, alpha / 100.0F));
int x = 0;
int y = 0;
if (watermarkPosition == WatermarkPosition.topLeft) {
x = 0;
y = 0;
} else if (watermarkPosition == WatermarkPosition.topRight) {
x = srcWidth - watermarkImageWidth;
y = 0;
} else if (watermarkPosition == WatermarkPosition.center) {
x = (srcWidth - watermarkImageWidth) / 2;
y = (srcHeight - watermarkImageHeight) / 2;
} else if (watermarkPosition == WatermarkPosition.bottomLeft) {
x = 0;
y = srcHeight - watermarkImageHeight;
} else if (watermarkPosition == WatermarkPosition.bottomRight) {
x = srcWidth - watermarkImageWidth;
y = srcHeight - watermarkImageHeight;
} else if (watermarkPosition == WatermarkPosition.repeat) {
x = 0;
y = 0;
int spacing = 100;
for (int i = 0; i < srcWidth; i += watermarkImageWidth
+ spacing) {
for (int j = 0; j < srcHeight; j += watermarkImageHeight
+ spacing) {
graphics2D.drawImage(watermarkBufferedImage, i, j,
watermarkImageWidth, watermarkImageHeight,
null);
}
}
}
graphics2D.drawImage(watermarkBufferedImage, x, y,
watermarkImageWidth, watermarkImageHeight, null);
}
ImageIO.write(destBufferedImage, "JPG", destFile);
} catch (Exception e) {
e.printStackTrace();
}
}
// 水印位置(无、左上、右上、居中、左下、右下,平铺)
public enum WatermarkPosition {
no, topLeft, topRight, center, bottomLeft, bottomRight,repeat
}