<!-先创建文件夹,以便图片存放-!>
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",
"我们并肩坐在冰凉的台阶上,有风吹过,有爱来过。却最终被我们,一起错过。 原来,时间真的像流水,走得悄无声息。很多时光,很多事情,很多人,永远只能存在记忆里。");
}
}