对图片添加水印
同样类似对pdf文件添加水印,但是使用的技术不一样。代码如下:
1 import org.slf4j.Logger; 2 import org.slf4j.LoggerFactory; 3 4 import javax.imageio.ImageIO; 5 import javax.swing.*; 6 import java.awt.*; 7 import java.awt.image.BufferedImage; 8 import java.io.*; 9 10 /** 11 * 图片套印工具类 12 * @author limingcheng 13 * 14 */ 15 public class PicUtils { 16 17 private final static Logger LOGGER = LoggerFactory.getLogger(PdfUtils.class); 18 19 /** 20 * @description 给图片平铺添加水印 21 * @param sourceImgPath 源图片路径 22 * @param tarImgPath 保存的图片路径 23 * @param waterMarkContent 水印内容 24 * @param fileExt 图片格式 25 * @return void 26 */ 27 public void addWatermarkTile(String sourceImgPath, String tarImgPath, String waterMarkContent, String fileExt){ 28 Font font = new Font("宋体", Font.BOLD, 24);//水印字体,大小 29 Color markContentColor = Color.white;//水印颜色 30 Integer degree = -45;//设置水印文字的旋转角度 31 float alpha = 1.0f;//设置水印透明度 默认为1.0 值越小颜色越浅 32 OutputStream outImgStream = null; 33 try { 34 File srcImgFile = new File(sourceImgPath);//得到文件 35 Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片 36 int srcImgWidth = srcImg.getWidth(null);//获取图片的宽 37 int srcImgHeight = srcImg.getHeight(null);//获取图片的高 38 // 加水印 39 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); 40 Graphics2D g = bufImg.createGraphics();//得到画笔 41 g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); 42 g.setColor(markContentColor); //设置水印颜色 43 g.setFont(font); //设置字体 44 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度 45 if (null != degree) { 46 g.rotate(Math.toRadians(degree),(double)bufImg.getWidth(),(double)bufImg.getHeight());//设置水印旋转 47 } 48 JLabel label = new JLabel(waterMarkContent); 49 FontMetrics metrics = label.getFontMetrics(font); 50 int width = metrics.stringWidth(label.getText());//文字水印的宽 51 int rowsNumber = srcImgHeight/width+srcImgHeight%width;// 图片的高 除以 文字水印的宽 打印的行数(以文字水印的宽为间隔) 52 int columnsNumber = srcImgWidth/width+srcImgWidth%width;//图片的宽 除以 文字水印的宽 每行打印的列数(以文字水印的宽为间隔) 53 //防止图片太小而文字水印太长,所以至少打印一次 54 if(rowsNumber < 1){ 55 rowsNumber = 1; 56 } 57 if(columnsNumber < 1){ 58 columnsNumber = 1; 59 } 60 for(int j=0;j<rowsNumber;j++){ 61 for(int i=0;i<columnsNumber;i++){ 62 g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置 63 } 64 } 65 g.dispose();// 释放资源 66 // 输出图片 67 outImgStream = new FileOutputStream(tarImgPath); 68 ImageIO.write(bufImg, fileExt, outImgStream); 69 } catch (Exception e) { 70 e.printStackTrace(); 71 e.getMessage(); 72 } finally{ 73 try { 74 if(outImgStream != null){ 75 outImgStream.flush(); 76 outImgStream.close(); 77 } 78 } catch (Exception e) { 79 e.printStackTrace(); 80 e.getMessage(); 81 } 82 } 83 } 84 85 /** 86 * 在图片中间添加文字水印 87 * @param imgIS 88 * @param imgOS 89 * @param textContent 90 * @param fileType 91 */ 92 public void addWatermarkCenter(InputStream imgIS, OutputStream imgOS, String textContent, String fileType){ 93 94 Color markContentColor = Color.GRAY;//水印颜色 95 Integer degree = 45;//设置水印文字的旋转角度 96 float alpha = 0.5f;//设置水印透明度 默认为1.0 值越小颜色越浅 97 try { 98 Image srcImg = ImageIO.read(imgIS); //文件转化为图片 99 int srcImgWidth = srcImg.getWidth(null);//获取图片的宽 100 int srcImgHeight = srcImg.getHeight(null);//获取图片的高 101 int fontSize = (srcImgWidth*3)/40; 102 Font font = new Font("宋体", Font.BOLD, fontSize);//水印字体,大小 103 // 加水印 104 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); 105 Graphics2D g2d = bufImg.createGraphics();//得到画笔 106 g2d.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); 107 g2d.setColor(markContentColor); //设置水印颜色 108 g2d.setFont(font); //设置字体 109 g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度 110 111 g2d.rotate(Math.toRadians(degree),srcImgWidth/5,srcImgHeight/5);//设置水印旋转 112 g2d.drawString(textContent, srcImgWidth/5,srcImgHeight/5);//画出水印,并设置水印位置 113 g2d.dispose();// 释放资源 114 // 输出图片 115 ImageIO.write(bufImg, fileType, imgOS); 116 } catch (Exception e) { 117 e.printStackTrace(); 118 e.getMessage(); 119 } finally{ 120 121 } 122 } 123 124 public static void main(String[] args) throws FileNotFoundException { 125 InputStream imgIS = null; 126 OutputStream imgOS = null; 127 try { 128 File inFile = new File("E:/图片/c43e0f5accb56db2cd75f1e6c6071902.jpg"); 129 File outFile = new File("E:/图片/test007.jpg"); 130 imgIS = new FileInputStream(inFile); 131 imgOS = new FileOutputStream(outFile); 132 new PicUtils().addWatermarkCenter(imgIS, imgOS, "内部使用,仅供查看", "jpg"); 133 134 } catch (IOException e) { 135 e.printStackTrace(); 136 } finally { 137 try { 138 if(imgIS != null) { 139 imgIS.close(); 140 } 141 } catch (IOException e) { 142 e.printStackTrace(); 143 } 144 try { 145 if(imgOS != null) { 146 imgOS.close(); 147 } 148 } catch (IOException e) { 149 e.printStackTrace(); 150 } 151 } 152 153 } 154 155 156 }
效果如下: