1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Java实现图片水印文字换行 平铺 旋转效果

Java实现图片水印文字换行 平铺 旋转效果

时间:2021-06-25 23:45:56

相关推荐

Java实现图片水印文字换行 平铺 旋转效果

Java代码实现对图片的水印文字的添加。

水印的效果是:水印文字的换行、水印文字的平铺、水印文字的旋转

import java.awt.Color;import java.awt.Font;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 MyTest {/*** 水印之间的横向间隔*/private static final int XMOVE = 80;/*** 水印之间的纵向间隔*/private static final int YMOVE = 80;/*** 图片添加水印** @param outImgPath 添加水印后图片输出路径* @param markContentColor 水印文字的颜色* @param fontSize 文字大小* @param waterMarkContent 水印的文字,多排水印请使用"||"分割* @param srcImgPath 需要添加水印的图片的路径*/public void waterPress(String srcImgPath, String outImgPath, Color markContentColor, int fontSize, String waterMarkContent) {try {String[] waterMarkContents = waterMarkContent.split("\\|\\|");// 读取原图片信息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);// 设置水印旋转g.rotate(Math.toRadians(-45), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);// 获取其中最长的文字水印的大小int maxLen = 0;int maxHigh = 0;for (int i = 0; i < waterMarkContents.length; i++) {waterMarkContent = waterMarkContents[i];int fontlen = getWatermarkLength(waterMarkContent, g);if (fontlen >= maxLen) {maxLen = fontlen;}maxHigh = maxHigh + (i + 1) * fontSize + 10;}// 文字长度相对于图片宽度应该有多少行int line = srcImgWidth * 2 / maxLen;int co = srcImgHeight * 2 / maxHigh;int yz = 0;// 填充Y轴方向for (int a = 0; a < co; a++) {int t = 0;for (int j = 0; j < waterMarkContents.length; j++) {waterMarkContent = waterMarkContents[j];int y = (j + 1) * fontSize + 10 + t;// 文字叠加,自动换行叠加,注意符号int tempX = -srcImgWidth / 2;int tempY = -srcImgHeight / 2 + 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.drawString(sb.toString(), tempX, tempY);t = t + fontSize;// 清空内容,重新追加sb.delete(0, sb.length());tempY += fontSize;tempLineLen = 0;}// 追加字符sb.append(tempChar);}// 填充X轴for (int z = 0; z < line; z++) {// 最后叠加余下的文字g.drawString(sb.toString(), tempX, tempY);tempX = tempX + maxLen + XMOVE;}}yz = yz + maxHigh + YMOVE;}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);}/*** 获取水印文字总长度** @paramwaterMarkContent水印的文字* @paramg* @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 = "CSDN||stepmore||-05-27 17:00:00";new MyTest().waterPress("/Users/yangyun/Documents/personal_doc/pic/test1.png","/Users/yangyun/Documents/personal_doc/pic/yy.png", Color.red, 30, font);}}

示例图片:

水印图片:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。