1. 程式人生 > >圖片新增文字水印,實現文字換行居中

圖片新增文字水印,實現文字換行居中

結合各位前輩的文章,實現文字新增到圖片上,換行居中。

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
public class MyTest {

    /**
     * 圖片新增水印
     *
     * @param srcImgPath       需要新增水印的圖片的路徑
     * @param outImgPath       新增水印後圖片輸出路徑
* @param fontType 水印文字的字型 * @param fontStyle 水印文字的字型份風格 * @param markContentColor 水印文字的顏色 * @param fontSize 水印的文字的大小 * @param waterMarkContent 水印的文字內容 */ public void waterPress(String srcImgPath, String outImgPath, String fontType, int fontStyle, Color markContentColor, int
fontSize, String waterMarkContent) { try { // 讀取原圖片資訊 File srcImgFile = new File(srcImgPath); Image srcImg = null; if (srcImgFile.exists() && srcImgFile.isFile() && srcImgFile.canRead()) { 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(fontType, fontStyle, fontSize); //設定水印顏色 g.setColor(markContentColor); g.setFont(font); // 抗鋸齒 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int fontLength = getWatermarkLength(waterMarkContent, g); // 實際生成的水印文字,實際文字行數 Double textLineCount = Math.ceil(Integer.valueOf(fontLength).doubleValue() / Integer.valueOf(srcImgWidth).doubleValue()); // 實際所有的水印文字的高度 int textHeight = textLineCount.intValue() * fontSize; // 相對與X的起始的位置 int originX = 0; // 相對與Y的起始的位置 int originY = 0; // 實際文字大於1行,則x則為預設起始0, if (1 == textLineCount.intValue()) { // 實際文字行數是1,1/2個圖片高度,減去1/2個字元高度 originY = srcImgHeight / 2 - fontSize / 2; // 實際文字行數是1,計算x的居中的起始位置 originX = (srcImgWidth - fontLength) / 2; } else { // 實際文字行數大於1,1/2個圖片高度減去文字行數所需的高度 originY = (srcImgHeight - textHeight) / 2; } System.out.println("水印文字總長度:" + fontLength + ",圖片寬度:" + srcImgWidth + ",字元個數:" + waterMarkContent.length()); //文字疊加,自動換行疊加 int tempX = originX; int tempY = originY; int tempCharLen = 0;//單字元長度 int tempLineLen = 0;//單行字元總長度臨時計算 StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < waterMarkContent.length(); i++) { char tempChar = waterMarkContent.charAt(i); tempCharLen = getCharLen(tempChar, g); if (tempLineLen >= srcImgWidth) { // 繪製前一行 g.drawString(stringBuffer.toString(), tempX, tempY); //清空內容,重新追加 stringBuffer.delete(0, stringBuffer.length()); //文字長度已經滿一行,Y的位置加1字元高度 tempY = tempY + fontSize; tempLineLen = 0; } //追加字元 stringBuffer.append(tempChar); tempLineLen += tempCharLen; } //最後疊加餘下的文字 g.drawString(stringBuffer.toString(), tempX, tempY); g.dispose(); // 輸出圖片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "png", 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 fontType = "宋體"; int fontStyle = Font.BOLD; int fontSize = 30; String font = "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十" + "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十 一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十" + "一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十"; /* String font = "印效果測水印效果整水印效果 ";*/ new MyTest().waterPress("D:\\1.png", "D:\\2.png", fontType, fontStyle, Color.black, fontSize, font); } }