Java graphics2D 生成水印(水印文字或水印图片)全角度全覆盖方式。
计算覆盖范围
定义范围的四个点
@Data
@AllArgsConstructor
static class Xys{
double minX;
double maxX;
double minY;
double maxY;
}
计算覆盖范围的4个点
文字水印
/**
* 文字水印
* @param sourceImageFileBytes 原始图片的bytes
* @param watermarkText 文字,如:www.xqlee.com
* @param fontSize 字体大小,如:12,默认24
* @param watermarkColor 字体颜色,如:Color.RED,默认Color.GRAY
* @param degree 倾斜度,如:45,默认-45
* @param alpha 字体透明度,0-1,如:0.5f,默认0.3f
* @return 处理好以后的图片文件
* @throws IOException 处理过程中可能发生的异常
*/
public static byte [] drawImageTextWatermark(byte[] sourceImageFileBytes,String watermarkText, Integer fontSize, Color watermarkColor,Integer watermarkXSpace,Integer watermarkYSpace, Integer degree,Float alpha) throws IOException {
alpha = Objects.isNull(alpha)?0.3f:alpha;
degree = Objects.isNull(degree)?-45:degree;
watermarkColor = Objects.isNull(watermarkColor)?Color.GRAY:watermarkColor;
fontSize = (Objects.isNull(fontSize)||fontSize<=0)?24:fontSize;
watermarkXSpace = Objects.isNull(watermarkXSpace)?100:watermarkXSpace;
watermarkYSpace = Objects.isNull(watermarkYSpace)?180:watermarkYSpace;
//获取源图像的宽度、高度
Image image = ImageIO.read(new ByteArrayInputStream(sourceImageFileBytes));
int width = image.getWidth(null);
int height = image.getHeight(null);
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//创建绘图工具对象
Graphics2D graphics2D = bufferedImage.createGraphics();
//消锯齿
//文字锯齿
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//图形锯齿
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
//其他
graphics2D.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);
//设置高质量缩放参数(防止水印图片模糊/噪点不清晰)
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//底图绘画,其中的0代表和原图位置一样
graphics2D.drawImage(image, 0, 0, width, height, null);
//设置水印文字(设置水印字体样式、粗细、大小)
graphics2D.setFont(new Font(null, Font.PLAIN, fontSize));
//设置水印颜色
graphics2D.setColor(watermarkColor);
//设置水印透明度
graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
//设置水印旋转
double radians = Math.toRadians(degree);
graphics2D.rotate(radians, (double) bufferedImage.getWidth() / 2, (double) bufferedImage.getHeight() / 2);
//计算文本占用的宽度和高度
int fontsWidth = graphics2D.getFontMetrics().stringWidth(watermarkText);
int fontsHeight = graphics2D.getFontMetrics().getHeight();
Xys xys = getXys(width, height, radians);
for (double x = xys.getMinX() - watermarkXSpace; x < xys.maxX+watermarkXSpace; x += (watermarkXSpace + fontsWidth)) {
for (double y = xys.minY - watermarkYSpace; y < xys.maxY+watermarkYSpace; y += (watermarkYSpace + fontsHeight)) {
graphics2D.drawString(watermarkText,(float) x, (float)y);
}
}
graphics2D.dispose();
//重置大小
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//直接以png输出,输出jpg格式图片不清晰 / 后续步骤其他工具进行压缩转格式即可
ImageIO.write(bufferedImage,"png",bos);
return bos.toByteArray();
}
图片水印
/**
* 图片水印
* @param sourceImageFileBytes 处理图片
* @param watermarkImageFileBytes 水印图片
* @param watermarkXSpace 水印x(横向)间隔
* @param watermarkYSpace 水印y(纵向)间隔
* @param degree 旋转角度,如:-45
* @param alpha 透明度,如:0.3f
* @return 处理后图像
* @throws IOException 异常
*/
public static byte [] drawImageWatermark(byte[] sourceImageFileBytes,byte[] watermarkImageFileBytes,Integer watermarkXSpace,Integer watermarkYSpace, Integer degree, Float alpha) throws IOException {
alpha = Objects.isNull(alpha)?0.3f:alpha;
degree = Objects.isNull(degree)?-45:degree;
watermarkXSpace = Objects.isNull(watermarkXSpace)?100:watermarkXSpace;
watermarkYSpace = Objects.isNull(watermarkYSpace)?180:watermarkYSpace;
//获取源图像的宽度、高度
Image image = ImageIO.read(new ByteArrayInputStream(sourceImageFileBytes));
int width = image.getWidth(null);
int height = image.getHeight(null);
//获取水印宽度和高度
BufferedImage watermarkImage = ImageIO.read(new ByteArrayInputStream(watermarkImageFileBytes));
int watermarkImageHeight = watermarkImage.getHeight(null);
int watermarkImageWidth = watermarkImage.getWidth(null);
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//创建绘图工具对象
Graphics2D graphics2D = bufferedImage.createGraphics();
//消锯齿
//文字锯齿
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//图形锯齿
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
//设置高质量缩放参数(防止水印图片模糊/噪点不清晰)
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//绘画底图(原图片)其中的0代表和原图位置一样
graphics2D.drawImage(image, 0, 0, width, height, null);
//设置水印透明度
graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
//设置水印旋转
double radians = Math.toRadians(degree);
graphics2D.rotate(radians, (double) bufferedImage.getWidth() / 2, (double) bufferedImage.getHeight() / 2);
//计算文本占用的宽度和高度
Xys xys = getXys(width, height, radians);
for (double x = xys.getMinX() - watermarkXSpace; x < xys.maxX+watermarkXSpace; x += (watermarkXSpace + watermarkImageWidth)) {
for (double y = xys.minY - watermarkYSpace; y < xys.maxY+watermarkYSpace; y += (watermarkYSpace + watermarkImageHeight)) {
graphics2D.drawImage(watermarkImage,(int) x, (int)y,watermarkImageWidth,watermarkImageHeight,null);
}
}
graphics2D.dispose();
//重置大小
ByteArrayOutputStream bos=new ByteArrayOutputStream();
//直接以png输出,输出jpg格式图片不清晰 / 后续步骤其他工具进行压缩转格式即可
ImageIO.write(bufferedImage,"png",bos);
return bos.toByteArray();
}
关联:
版权所有 © 【代码谷】 欢迎非商用转载,转载请按下面格式注明出处,商业转载请联系授权,违者必究。(提示:点击下方内容复制出处)
源文: Java 图片水印任何范围覆盖计算 ,链接:https://www.daimagu.com/article/2512222019599829.html,来源:代码谷
评论