天天看點

[摘抄-Java-學習中]Java 圖檔疊加水印&文字自動換行

從網上找到了前輩們寫的代碼,然後優化整理下,實作了圖檔疊加水印,也就是文字疊加,然後再實作根據總文字的長度進行自動換行疊加文字

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

public class MyTest {

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); }

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); } }