java 图片添加水印工具

图片添加水印工具类

/*
 * 
 * 
 * 
 */
package utils;

import com.util.UnicodeReader;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;


/**
 * 给图片加水印工具
 */
public final class WaterMarkUtils {
	
	/**
	 * 复制图片文件,并添加水印
	 * @param srcImgPath  原图片路径
	 * @param outImgPath  生成的新图片路径
	 * @param waterMarkContent  水印内容
	 * @param markContentColor  水印颜色
	 * @param font  水印字体
	 */
	  public static void waterPress(String srcImgPath, String outImgPath, String waterMarkContent, Color markContentColor, Font font) {
	        try {
	            // 读取原图片信息
	            File srcImgFile = new File(srcImgPath);
	            Image srcImg = null;
	            if (srcImgFile.exists() && srcImgFile.isFile() && srcImgFile.canRead()) {
	                srcImg = ImageIO.read(srcImgFile);
	            }
	            // 宽、高
	            int srcImgWidth = srcImg.getWidth(null);
	            int srcImgHeight = srcImg.getHeight(null);
	            // 加水印
	            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
	            Graphics2D g = bufImg.createGraphics();
	            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
	            
	            //设置水印颜色
	            g.setColor(markContentColor);
	            g.setFont(font);
	            // 抗锯齿
	            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	            int fontLength = getWatermarkLength(waterMarkContent, g);
	            // 实际生成的水印文字,实际文字行数
	            Double textLineCount = Math.ceil(Integer.valueOf(fontLength).doubleValue() / Integer.valueOf(srcImgWidth).doubleValue());
	            int fontSize = font.getSize();
	            // 实际所有的水印文字的高度
	            int textHeight = textLineCount.intValue() * fontSize;
	            // 相对与X的起始的位置
	            int originX = 0;
	            // 相对与Y的起始的位置
	            int originY = 0;
	            // 实际文字大于1行,则x则为默认起始0,
	            if (1 == textLineCount.intValue()) {
	                // 实际文字行数是1,1/2个图片高度,减去1/2个字符高度
	                originY = srcImgHeight / 2 - fontSize / 2;
	                // 实际文字行数是1,计算x的居中的起始位置
	                originX = (srcImgWidth - fontLength) / 2;
	            } else {
	                // 实际文字行数大于1,1/2个图片高度减去文字行数所需的高度
	                originY = (srcImgHeight - textHeight) / 10;
	            }
	            System.out.println("水印文字总长度:" + fontLength + ",图片宽度:" + srcImgWidth + ",字符个数:" + waterMarkContent.length());
	            //文字叠加,自动换行叠加
	            int tempX = originX;
	            int tempY = originY;
	            int tempCharLen = 0;//单字符长度
	            int tempLineLen = 0;//单行字符总长度临时计算
	            StringBuffer stringBuffer = new StringBuffer();
	            for (int i = 0; i < waterMarkContent.length(); i++) {
	                char tempChar = waterMarkContent.charAt(i);
	                tempCharLen = getCharLen(tempChar, g);
	                if (tempLineLen >= srcImgWidth) {
	                    // 绘制前一行
	                    g.drawString(stringBuffer.toString(), tempX, tempY);
	                    //清空内容,重新追加
	                    stringBuffer.delete(0, stringBuffer.length());
	                    //文字长度已经满一行,Y的位置加1字符高度
	                    tempY = tempY + fontSize;
	                    tempLineLen = 0;
	                }
	                //追加字符
	                stringBuffer.append(tempChar);
	                tempLineLen += tempCharLen;
	            }
	            //最后叠加余下的文字
	            g.drawString(stringBuffer.toString(), tempX, tempY);
	            g.dispose();
	            // 输出图片
	            FileOutputStream outImgStream = new FileOutputStream(outImgPath);
	            ImageIO.write(bufImg, "png", outImgStream);
	            outImgStream.flush();
	            outImgStream.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	  
	  public static String waterPressBase64(String imgBase64, String waterMarkContent, Color markContentColor, Font font) {
		  ByteArrayOutputStream outImgStream = null;
		  String outImgStr  = "";//加上水印后的字节流字符串
		  try {
			  byte[] bts = Base64.decode(imgBase64);
				
			    // 读取原图片信息
			    Image srcImg = null;
			    InputStream input = new ByteArrayInputStream(bts);
			    srcImg = ImageIO.read(input);
			    // 宽、高
			    int srcImgWidth = srcImg.getWidth(null);
			    int srcImgHeight = srcImg.getHeight(null);
			    // 加水印
			    BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
			    Graphics2D g = bufImg.createGraphics();
			    g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
			    
			    //设置水印颜色
			    g.setColor(markContentColor);
			    g.setFont(font);
			    // 抗锯齿
			    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			    int fontLength = getWatermarkLength(waterMarkContent, g);
			    // 实际生成的水印文字,实际文字行数
			    Double textLineCount = Math.ceil(Integer.valueOf(fontLength).doubleValue() / Integer.valueOf(srcImgWidth).doubleValue());
			    int fontSize = font.getSize();
			    // 实际所有的水印文字的高度
			    int textHeight = textLineCount.intValue() * fontSize;
			    // 相对与X的起始的位置
			    int originX = 0;
			    // 相对与Y的起始的位置
			    int originY = 30;
			    // 实际文字大于1行,则x则为默认起始0,
			    if (1 == textLineCount.intValue()) {
			        // 实际文字行数是1,1/2个图片高度,减去1/2个字符高度
//			        originY = srcImgHeight / 2 - fontSize / 2;
			        // 实际文字行数是1,计算x的居中的起始位置
			        originX = (srcImgWidth - fontLength) / 2;
			    } else {
			        // 实际文字行数大于1,1/2个图片高度减去文字行数所需的高度
//			        originY = (srcImgHeight - textHeight) / 2;
			    }
			    System.out.println("水印文字总长度:" + fontLength + ",图片宽度:" + srcImgWidth + ",字符个数:" + waterMarkContent.length());
			    //文字叠加,自动换行叠加
			    int tempX = originX;
			    int tempY = originY;
			    int tempCharLen = 0;//单字符长度
			    int tempLineLen = 0;//单行字符总长度临时计算
			    StringBuffer stringBuffer = new StringBuffer();
			    for (int i = 0; i < waterMarkContent.length(); i++) {
			        char tempChar = waterMarkContent.charAt(i);
			        tempCharLen = getCharLen(tempChar, g);
			        if (tempLineLen >= srcImgWidth) {
			            // 绘制前一行
			            g.drawString(stringBuffer.toString(), tempX, tempY);
			            //清空内容,重新追加
			            stringBuffer.delete(0, stringBuffer.length());
			            //文字长度已经满一行,Y的位置加1字符高度
			            tempY = tempY + fontSize;
			            tempLineLen = 0;
			        }
			        //追加字符
			        stringBuffer.append(tempChar);
			        tempLineLen += tempCharLen;
			    }
			    //最后叠加余下的文字
			    g.drawString(stringBuffer.toString(), tempX, tempY);
			    g.dispose();
			    // 输出图片
			    outImgStream = new ByteArrayOutputStream();
			    ImageIO.write(bufImg, "png", outImgStream);
			    
			    byte[] outB = outImgStream.toByteArray();
			    outImgStr = Base64.encode(outB);
			    
			    outImgStream.flush();
	        	outImgStream.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
		  
		  return outImgStr;
	    }


	    public static String waterPressBase64(String imgBase64,String waterMarkContent){
	    	// 原图位置, 输出图片位置, 水印字体,水印文字样式,水印文字颜色, 水印文字大小,水印文字内容
	    	Font font = new Font("微软雅黑", Font.PLAIN, 30);   //水印字体
	    	Color color = new Color(55,55,55,128);
	    	return waterPressBase64(imgBase64, waterMarkContent, color, font);
	    }

	    public static int getCharLen(char c, Graphics2D g) {
	        return g.getFontMetrics(g.getFont()).charWidth(c);
	    }

	    /**
	     * 获取水印文字总长度
	     *
	     * @paramwaterMarkContent水印的文字
	     * @paramg
	     * @return水印文字总长度
	     */
	    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
	        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
	    }
	    

	    
	    public void getImgBase64String(){
	    	File file = new File("D:/tutu.png");
	    	String imgStr = "";
	    	try {
				InputStream in = new FileInputStream(file);
				byte[] data = new byte[in.available()];
				in.read(data);
				in.close();
				
				imgStr = new String(Base64.encode(data));
				System.out.println(imgStr);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
	    	
	    }
	    
	    //测试复制图片并添加水印
	    public void testWaterPressFile(){
	    	// 原图位置, 输出图片位置, 水印字体,水印文字样式,水印文字颜色, 水印文字大小,水印文字内容
	    	Font font = new Font("微软雅黑", Font.PLAIN, 18);   //水印字体
//	    	Color color = new Color(0,55,55,128);
	    	Color color = Color.RED;
	    	String content = "mengmeng";
	    	/* String font = "印效果测水印效果整水印效果 ";*/
	    	WaterMarkUtils.waterPress(
	    			"D:/tutu.png",
	    			"D:/tutu-water.png",
	    			content, color, font);
	    }

	    public static void main(String[] args) {
	    	new WaterMarkUtils().testWaterPressFile();
	    	new WaterMarkUtils().getImgBase64String();
	    	
	    }
	    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值