java图片添加水印文字

java图片中添加文字水印(铺满整个图片)

package com.zhuozhengsoft.mark;

import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.AttributedCharacterIterator; import java.text.AttributedString;

import javax.imageio.ImageIO; /** * 生成水印图片,可设置水印文本的Font,透明度,倾斜度,图片的高度,宽度等 * * @author Dong * @date 2017.3.3 */ public class MarkImage { // 水印的字体,默认(“宋体”, Font.BOLD, 30); PRivate Font font = new Font(“宋体”, Font.BOLD, 30); // 水印的颜色,默认红色 private Color color = Color.red; // 水印的透明度,默认0.5共有三个值可选(0,0.5,1透明度依次增强) private float alpha = 0.5f; // 水印的倾斜度,默认逆时针旋转45度 private Integer degree = -45; // 水印文字之间的间距 private Integer distance = 100; // 水印的文本内容,默认”加密文档” private String markText = “加密文档”;

public void setFont(Font font) { this.font = font; } public void setColor(Color color) { this.color = color; } public void setAlpha(float alpha) { this.alpha = alpha; } public void setDegree(Integer degree) { this.degree = degree; } public void setMarkText(String markText) { this.markText = markText; } public void setDistance(Integer distance) { this.distance = distance; } /** * * @param text:根据水印文本获取文本的长度 * @return */ private int getTextLength(String text) { int length = text.length();// 获取所有文本的长度 for (int i = 0; i < text.length(); i++) { String s = String.valueOf(text.charAt(i));// 获取指定的字符 if (s.getBytes().length > 1) {// 字节长度大于1,说明是中文,那么需要延长文本长度 length++; } } // 计算总共有多少个字节,也就是有多少个字 length = (length % 2 == 0) ? length / 2 : length / 2 + 1; return length; } /** * * @param targetPath:生成的目标图片的路径 * @param width:图片的宽度 * @param height:图片的高度 */ public void createMarkImage(String targetPath,int width,int height) { Image srcImg = null; OutputStream outputStream = null; try { // 1.创建源空白图片 BufferedImage buffImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); // 2、得到画笔对象 Graphics2D graph = buffImg.createGraphics(); graph.setClip(0, 0, width, height); graph.setColor(Color.white); graph.fillRect(0, 0, width, height);// 先用黑色填充整张图片,也就是背景 ImageIO.write(buffImg, "JPG", new File(targetPath));// 输出png图片 System.out.println("空白图片已经生成"); //3.读取生成的空白图片 srcImg = ImageIO.read(new File(targetPath)); // 4、设置对线段的锯齿状边缘处理 graph.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graph.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); // 5、设置水印旋转度 graph.rotate(Math.toRadians(this.degree), (double) buffImg .getWidth() / 2, (double) buffImg.getHeight() / 2); // 6、设置水印文字颜色 graph.setColor(this.color); // 7、设置水印文字Font AttributedString ats = new AttributedString(this.markText); ats.addAttribute(TextAttribute.FONT, this.font, 0, this.markText .length()); AttributedCharacterIterator iter = ats.getIterator(); graph.setFont(this.font); // 8、设置水印文字透明度 graph.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_ATOP, this.alpha)); // 9.循环添加水印 int textW = this.font.getSize() * getTextLength(this.markText); int textH = this.font.getSize(); int x = -srcImg.getWidth(null) / 2; int y = -srcImg.getHeight(null) / 2; while (x < srcImg.getWidth(null) * 1.5) { y = -srcImg.getHeight(null) / 2; while (y < srcImg.getHeight(null) * 1.5) { // 添加水印效果 graph.drawString(iter, x, y);// y保证至少可以显示一个水印的高度 y += textH + this.distance;// distance为间隔值,即每个水印之间的间隔 } x += textW + this.distance; } // 10.释放资源 graph.dispose(); // 11、生成水印图片 outputStream = new FileOutputStream(targetPath); ImageIO.write(buffImg, "JPG", outputStream); System.out.println("图片完成添加水印文字"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != srcImg) srcImg.flush(); } catch (Exception e) { e.printStackTrace(); } try { if (null != outputStream) outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }

}

/** * 测试生成水印图片 */ public static void main(String[] args) { MarkImage markImage=new MarkImage(); markImage.setMarkText("今天天气不错!"); markImage.setFont(new Font("微软雅黑",Font.BOLD,35)); markImage.setColor(Color.pink); markImage.setAlpha(1.0f); markImage.createMarkImage("D:\\mark.jpg", 700,1400); } -

浏览器兼容

目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。 IE9以下不支持 IE9,10,11存在以下问题 不支持离线功能 IE9不支持文件导入导出 IE10不支持拖拽文件导入