java 给图片生成换行斜体水印
作者:互联网
package util; /**
* @Author: CodingPeppa
* @Description:
* @Data: Created in 10:39 2022/1/4
* @Modified By:
*/
import org.apache.commons.lang.StringUtils;
import sun.font.FontDesignMetrics;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
/**
*
* 生成水印
*
*/
public class MarkUtil {
/**
* @description
* @param sourceImgPath 源图片路径
* @param tarImgPath 保存的图片路径
* @param waterMarkContent 水印内容 使用||分隔给水印内容换行
* @param fileExt 图片格式
* @param fontSize 字体
* @param markContentColor 字体颜色
* @param degree 旋转角度
* @param alpha 透明度
* @return void
*/
public static void watermarkByText(String sourceImgPath, String tarImgPath, String waterMarkContent, String fileExt,
Integer fontSize,Color markContentColor,Double degree,Float alpha){
Font font = new Font("宋体", Font.BOLD, fontSize);//水印字体,大小
// Color markContentColor = Color.RED;//水印颜色
// Integer degree = 45;//设置水印文字的旋转角度
// float alpha = 0.7f;//设置水印透明度
String[] waterMarkContents = waterMarkContent.split("\\|\\|");
// 获取其中最长的文字水印的大小
int maxLen = 0;
int maxHigh = 0;
for (int i = 0; i < waterMarkContents.length; i++) {
waterMarkContent = waterMarkContents[i];
int fontlen = getStringLength(font,waterMarkContent);
if (fontlen >= maxLen) {
maxLen = fontlen;
}
maxHigh = maxHigh + (i + 1) * fontSize + 10;
}
int lineNum=waterMarkContents.length;
OutputStream outImgStream = null;
try {
File srcImgFile = new File(sourceImgPath);//得到文件
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);
g.setColor(markContentColor); //设置水印颜色
g.setFont(font); //设置字体
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
if (degree!=null) {
g.rotate(Math.toRadians(degree));//设置水印旋转
}
int rowsNumber = srcImgHeight/maxLen;// 图片的高 除以 文字水印的宽 ——> 打印的行数(以文字水印的宽为间隔)
int columnsNumber = srcImgWidth/maxLen;//图片的宽 除以 文字水印的宽 ——> 每行打印的列数(以文字水印的宽为间隔)
//防止图片太小而文字水印太长,所以至少打印一次
if(rowsNumber < 1){
rowsNumber = 1;
}
if(columnsNumber < 1){
columnsNumber = 1;
}
for(int j=0;j<rowsNumber;j++){
for(int i=0;i<columnsNumber;i++){
for(int m=0;m<lineNum;m++){
// g.drawString(waterMarkContent, i*Mwidth + j*Mwidth, -i*Mwidth + j*Mwidth);//画出水印,并设置水印位置
g.drawString(waterMarkContents[m],i*maxLen+j*maxLen,-i*maxLen + j*maxLen+fontSize*(1+m));
}
}
}
g.dispose();// 释放资源
// 输出图片
outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufImg, fileExt, outImgStream);
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
} finally{
try {
if(outImgStream != null){
outImgStream.flush();
outImgStream.close();
}
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
}
}
}
public static void watermarkByText(String sourceImgPath, String tarImgPath, String waterMarkContent, String fileExt){
int fontSize=40;
Color markContentColor = Color.WHITE;//水印颜色
Double degree = 45d;//设置水印文字的旋转角度
Float alpha = 0.7f;//设置水印透明度
watermarkByText(sourceImgPath,tarImgPath,waterMarkContent,fileExt,fontSize,markContentColor,degree,alpha);
}
public static void watermarkByText(String sourceImgPath, String tarImgPath, String waterMarkContent, String fileExt,Float alpha){
int fontSize=40;
Color markContentColor = Color.WHITE;//水印颜色
Double degree = 45d;//设置水印文字的旋转角度
watermarkByText(sourceImgPath,tarImgPath,waterMarkContent,fileExt,fontSize,markContentColor,degree,alpha);
}
public static void watermarkByText(String sourceImgPath, String tarImgPath,String waterMarkContent, String fileExt,Integer fontSize ){
Color markContentColor = Color.WHITE;//水印颜色
Double degree = 45d;//设置水印文字的旋转角度
Float alpha = 0.7f;//设置水印透明度
watermarkByText(sourceImgPath,tarImgPath,waterMarkContent,fileExt,fontSize,markContentColor,degree,alpha);
}
public static void watermarkByText(String sourceImgPath, String tarImgPath,String waterMarkContent, String fileExt,Double degree ){
int fontSize=40;
Color markContentColor = Color.WHITE;//水印颜色
Float alpha = 0.7f;//设置水印透明度
watermarkByText(sourceImgPath,tarImgPath,waterMarkContent,fileExt,fontSize,markContentColor,degree,alpha);
}
//得到默认字体
public static Font getDefaultFont() {
return new Font(null);
}
//得到字符串长度
public static int getStringLength(Font font, String str) {
if (StringUtils.isEmpty(str)) {
return 0;
}
if (null == font) {
font = getDefaultFont();
}
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
char[] strcha = str.toCharArray();
int strWidth = metrics.charsWidth(strcha, 0, str.length());
return strWidth;
}
}
测试:
public class Test {
public static void main(String[] args) throws Exception {
String s="用户CodingPeppa||于2022-01-05||11:15:20调用该路视频";
MarkUtil.watermarkByText("D:/加水印/1.jpg", "D:/加水印/out/xxx.jpg", s,"jpg",0.5f);
}
}
加水印结果
标签:java,斜体,degree,int,水印,waterMarkContent,fontSize,String 来源: https://blog.csdn.net/qq_44073614/article/details/122322611