概述
图片添加水印工具类
/*
*
*
*
*/
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();
}
}
最后
以上就是淡然学姐为你收集整理的java 图片添加水印工具的全部内容,希望文章能够帮你解决java 图片添加水印工具所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复