[摘抄-Java-学习中]Java 图片叠加水印&文字自动换行

从网上找到了前辈们写的代码,然后优化整理下,实现了图片叠加水印,也就是文字叠加,然后再实现根据总文字的长度进行自动换行叠加文字


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

/**
* Created by uchoice on 2016/11/25.
*/
public class MyTest {

/**
* 图片添加水印
* @param srcImgPath 需要添加水印的图片的路径
* @param outImgPath 添加水印后图片输出路径
* @param markContentColor 水印文字的颜色
* @param fontSize 文字大小
* @param waterMarkContent 水印的文字
*/
public void waterPress(String srcImgPath, String outImgPath, Color markContentColor, int fontSize, String waterMarkContent) {
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("Courier New", Font.PLAIN, 12);
Font font = new Font( "宋体" , Font. PLAIN , fontSize);
g.setColor(markContentColor); //根据图片的背景设置水印颜色

g.setFont(font);
int fontlen = getWatermarkLength(waterMarkContent, g);

int line = fontlen/srcImgWidth; //文字长度相对于图片宽度应该有多少行

int y = srcImgHeight - (line + 1 )*fontSize;
System. out .println( "水印文字总长度:" + fontlen + ",图片宽度:" + srcImgWidth + ",字符个数:" + waterMarkContent.length());

//文字叠加,自动换行叠加
int tempX = 0 ;
int tempY = y;
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.drawString(sb.toString(), tempX, tempY);

sb.delete( 0 , sb.length()); //清空内容,重新追加

tempY += fontSize;

tempLineLen = 0 ;
}
sb.append(tempChar); //追加字符
}

g.drawString(sb.toString(), tempX, tempY); //最后叠加余下的文字
g.dispose();

// 输出图片
FileOutputStream outImgStream = new FileOutputStream(outImgPath);
ImageIO. write (bufImg, "jpg" , outImgStream);
outImgStream.flush();
outImgStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public int getCharLen( char c, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charWidth(c);
}

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

public static void main(String[] args) {
// 原图位置, 输出图片位置, 水印文字颜色, 水印文字
String font = "qqqqqqssss2222..... ooooddd水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整水印效果测水印效果整" ;
new MyTest().waterPress( "/Users/slink/3f608a0601_0.jpg" , "/Users/slink/afterWatermark.jpg" , Color. red , 40 , font);
}
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lock颠颠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值