Java 图片加水印

java 专栏收录该内容
57 篇文章 0 订阅
<!-先创建文件夹,以便图片存放-!>

private void newFolder(String folderPath) {

     String filePath = folderPath;
     filePath = filePath.toString(); //指定路径的建文件夹
     java.io.File myFilePath = new java.io.File(filePath);
     try {
          if (myFilePath.isDirectory()) {  //已经存在
                System.out.println("该文件目录已经存在");
          } else {
              myFilePath.mkdir();  //建立文件夹
           }
         } catch (Exception e) {
            e.printStackTrace();
         }
 }

 

注: 若要建多层次的文件夹,必须一次一次的建,此方法不支持一次性建完。

 

 

二:目录建好后,文字图片合成

    public String ImageMoneyVsName(String Name,Long Money,String url,Long shopCode) {
        try {
            // 读取模板图片内容
            JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(url);  //读取图片路径
            BufferedImage image = decoder.decodeAsBufferedImage();
            Graphics2D g = image.createGraphics();// 得到图形上下文
            g.setColor(Color.BLACK); // 设置画笔颜色
            RenderingHints rh = new RenderingHints( RenderingHints.KEY_ANTIALIASING,                                                    RenderingHints.VALUE_ANTIALIAS_ON);
            rh.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
            rh.put(RenderingHints.KEY_ALPHA_INTERPOLATION,RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            rh.put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g.setRenderingHints(rh);
            g.setColor(Color.black);
            Font font = new Font("宋体", Font.BOLD, 12);
            g.setFont(font);
            FontMetrics fm = g.getFontMetrics(font); 

           //设置换行操作
            int fontHeight = fm.getHeight(); //字符的高度
            int offsetLeft = 16;  
            int rowIndex = 1;  
            for(int i=0;i<Name.length();i++){  
                char c = Name.charAt(i);  
                int charWidth = fm.charWidth(c); //字符的宽度  
                //另起一行  
                if(Character.isISOControl(c) || offsetLeft >= (171-charWidth)){  
                    rowIndex++;  
                    offsetLeft = 16;  
                }  
                g.drawString(String.valueOf(c), offsetLeft, rowIndex * fontHeight);   //把一个个写到图片上 
                offsetLeft += charWidth;   //设置下字符的间距
            }
            Font font1 = new Font("宋体", Font.BOLD, 16);
            g.setFont(font1);
            g.drawString("金额:"+Money+"元",50,65);//50代表以图片左上顶点为原点的宽度,65代表以图片左上顶点为原点的高度
            g.dispose();
            // 穿件客户文件夹
            String Folder=FileUtils.encrypt(shopCode);
            newFolder("S/");
            newFolder("S/"+ Folder);

            newFolder("S/"+ Folder+ "/"+"COUPON");  //分三级目录
//图片的名称(把当前的时间分离设置成图片的名字)

            String imgurl="S_"+String.valueOf(new Date().toLocaleString()).replace("_", "").replace(":", "").replace(" ", "").replace("-", "") + ".jpg";  
            String outFileName ="S/" +Folder  + "/"+"COUPON"+"/" + imgurl;  //图片要存储的路径
            FileOutputStream out = new FileOutputStream(outFileName);//通过流操作把文字图片结合
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();
            return outFileName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这个也可以。。

 

package com.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

public class WaterMarkUtils {

	/**
	 * 给图片添加水印
	 * 
	 * @param filePath
	 *            需要添加水印的图片的路径
	 * @param markContent
	 *            水印的文字
	 * @param markContentColor
	 *            水印文字的颜色
	 * @param qualNum
	 *            图片质量
	 * @return
	 */
	public void mark(String srcImgPath, String outImgPath, String watermarkStr) {
		try {
			// 读取原图片信息
			File srcImgFile = new File(srcImgPath);
			Image 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);

//			Font font = new Font("微软雅黑", Font.PLAIN, 18);
			Font font = new Font("楷书", Font.PLAIN, 15);
			g.setColor(Color.white); // 根据图片的背景设置水印颜色
			
			g.setFont(font);
			int x = (srcImgWidth - getWatermarkLength(watermarkStr, g)) / 1;
			int y = srcImgHeight / 1;
			
	
			//------------------------------------------------------------------
			FontMetrics fm = g.getFontMetrics(font);
			 //设置换行操作
            int fontHeight = fm.getHeight(); //字符的高度
			int offsetLeft = 30;  
            int rowIndex = 12; 
			 for(int i=0;i<watermarkStr.length();i++){  
	                char c = watermarkStr.charAt(i);  
	                int charWidth = fm.charWidth(c); //字符的宽度  
	                //另起一行  
	                if(Character.isISOControl(c) || offsetLeft >= (srcImgWidth-charWidth)){  
	                    rowIndex++;  
	                    offsetLeft = 16;  
	                }  
	                g.drawString(String.valueOf(c), offsetLeft, rowIndex * fontHeight);   //把一个个写到图片上 
	                offsetLeft += charWidth;   //设置下字符的间距
	            }
			//------------------------------------------------------------------

            
		//	g.drawString(watermarkStr, x+10, y-5);
			
			
			g.dispose();
			// 输出图片
			FileOutputStream outImgStream = new FileOutputStream(outImgPath);
			ImageIO.write(bufImg, "jpg", outImgStream);
			outImgStream.flush();
			outImgStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 获取水印文字总长度
	public int getWatermarkLength(String str, Graphics2D g) {
		return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0,
				str.length());
	}

	public static void main(String[] args) { // 原图位置, 输出图片位置, 水印文字
		new WaterMarkUtils().mark("c://baitian.jpg", "c://baitian---.jpg",
				
				"我们并肩坐在冰凉的台阶上,有风吹过,有爱来过。却最终被我们,一起错过。 原来,时间真的像流水,走得悄无声息。很多时光,很多事情,很多人,永远只能存在记忆里。");
	}

}


 

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值