java水印工具类在请看上面的立即下载
转载请注明出处,谢谢
ImageUtil类代码,使用时调用 markerText 方法就行
import ption.BizException;
import s.dto.FileVO;
import org.apachemons.lang3.StringUtils;
import org.apache.ibatis.logging.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Base64;
import java.util.List;public class ImageUtil {/*** 给图片添加文字水印* @param waterMarkContents 水印文字(一个集合一个值对应一条水印)* @param buffin 源图像输入流* @param fileSuffix 文件后缀名* @param fontSize 水印字体大小* @param color 水印的字体颜色* @param alpha 水印透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字* @return byte[]*/public static byte[] markerText(List<String> waterMarkContents, InputStream buffin, String fileSuffix, int fontSize, Color color, float alpha) {if (buffin == null) {return null;}ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try {// 水印之间的横向间隔int xmove = 100;// 水印之间的纵向间隔int ymove = 100;Image srcImg = ad(buffin);//文件转化为图片int srcImgWidth = Width(null);//获取图片的宽int srcImgHeight = Height(null);//获取图片的高// 根据图片高度决定水印文字大小,文字间隔if (srcImgHeight <= 500 && srcImgWidth <= 500) {fontSize = 20;xmove = 50;ymove = 50;} else if (srcImgHeight > 500 && srcImgHeight <= 1000 && srcImgWidth > 500 && srcImgWidth <= 1000) {fontSize = 28;} else if (srcImgHeight > 1000 && srcImgHeight <= 2000 && srcImgWidth > 1000 && srcImgWidth <= 2000) {fontSize = 50;xmove = 150;ymove = 150;} else if (srcImgHeight > 2000 && srcImgWidth > 2000) {fontSize = 95;xmove = 300;ymove = 300;}if (srcImgHeight > 3000 && srcImgWidth > 3000) {fontSize = 135;xmove = 400;ymove = 400;}Font font = new Font("宋体", Font.BOLD, fontSize);// 获取其中最长的文字水印的大小int maxLen = 0;int maxHigh = 0;for (int i = 0; i < waterMarkContents.size(); i++) {String waterMarkContent = (i);int fontlen = getStringLength(font, waterMarkContent);if (fontlen >= maxLen) {maxLen = fontlen;}maxHigh = maxHigh + (i + 1) * fontSize + 10;}//一个div 每行每列的打印到图片 上int rowsNumber = 15;// 图片的高 除以 文字水印的宽 打印的行数(以文字水印的宽为间隔)int columnsNumber = 15;//图片的宽 除以 文字水印的宽 每行打印的列数(以文字水印的宽为间隔)// 加水印BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = ateGraphics();//得到画笔g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);g.setColor(color); //设置水印颜色g.setFont(font);//设置字体g.Instance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度g.Radians(-45), srcImgWidth, srcImgHeight);//设置水印旋转//至少打印一次if (rowsNumber < 1) {rowsNumber = 1;}if (columnsNumber < 1) {columnsNumber = 1;}int yz = 0;//遍历每行打印到图片上的个数for (int a = 0; a < rowsNumber; a++) {int t = 0;for (int j = 0; j < waterMarkContents.size(); j++) {String waterMarkContent = (j);int y = (j + 1) * 40 + 10 + t;// 文字叠加,自动换行叠加,注意符号int tempX = 10;int tempY = (-srcImgHeight / 2) - 150 + y + yz;// 单字符长度int tempCharLen = 0;// 单行字符总长度临时计算int tempLineLen = 0;StringBuffer sb = new StringBuffer();for (int i = 0; i < waterMarkContent.length(); i++) {char tempChar = waterMarkContent.charAt(i);tempCharLen = getCharLen(tempChar, g);tempLineLen += tempCharLen;// 和图片的长度进行对应的比较操作if (tempLineLen >= srcImgWidth) {// 长度已经满一行,进行文字叠加g.String(), tempX, tempY);t = t + 40;// 清空内容,重新追加sb.delete(0, sb.length());tempY += 40;tempLineLen = 0;}// 追加字符sb.append(tempChar);}// 遍历每列打印到图片上的个数for (int z = 0; z < columnsNumber; z++) {// 最后叠加余下的文字g.String(), tempX, tempY);tempX = tempX + maxLen + xmove;}}yz = yz + maxHigh + ymove;}g.dispose();// 释放资源ImageIO.write(bufImg, fileSuffix, outputStream);} catch (Exception e) {e.printStackTrace();e.getMessage();}ByteArray();}public static int getCharLen(char c, Graphics2D g) {Font()).charWidth(c);}//得到字符串长度public static int getStringLength(Font font, String markContent) {if (StringUtils.isEmpty(markContent)) {return 0;}if (null == font) {font = new Font(null);}JLabel label = new JLabel(markContent);FontMetrics metrics = FontMetrics(font);int width = metrics.Text());//文字水印的宽return width;}
}
返回的是byte []字节数组,要生成图片可以参考下面方法
// bytes 图片字节数组,path 保存路径
public static boolean byteEncryptFile(byte [] bytes, String path) {// 图像数据为空if (bytes == null) {return false;}if(path == null || StringUtils.isEmpty(path)){return false;}try {createFileParentDir(path, 0);} catch (Exception e) {System.out.println("创建文件目录失败");}OutputStream out = null;try {out = new FileOutputStream(path);out.write(bytes);out.flush();return true;} catch (Exception e) {System.out.println("保存图片失败");}finally {if(out!=null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}return false;}// 创建文件路径
public static void createFileParentDir(String imgFilePath, Integer num) {try {File dirFile = new File(imgFilePath);if(!ParentFile().exists()&& !ParentFile().mkdirs()){System.out.println("创建文件目录失败!");}} catch (Exception e) {if (num < 2) {num++;createFileParentDir(imgFilePath, num);} else {throw e;}}}
增加水印后的图片,文件大小会比原来的大一点,图片压缩可以参考我另一篇文章
码字不易,于你有利,勿忘点赞
北国风光,千里冰封,万里雪飘
本文发布于:2024-01-28 10:49:21,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064101646886.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |