java 批量为图片添加图标水印和文字水印
生活随笔
收集整理的這篇文章主要介紹了
java 批量为图片添加图标水印和文字水印
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需求,給指定目錄下面以.jpg結尾的文件,添加圖標水印和文字水印
文章目錄
- 一、基礎版本
- 二、升級版本
- 三、依賴
一、基礎版本
package com.gblfy.util;import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException;/*** java為圖片添加圖標水印和文字水印** @author gblfy* @version 1.0* @explain 文字水印、圖片水印* @creationTime 2020/07/01*/ public class WaterMarkUtil {//水印圖片路徑private static String WATER_MARKIMG_PATH = "D:" + File.separator + "1" + File.separator + "iconPath" + File.separator + "22.png";//當前登陸操作員 采用全局變量private static String operator;static {operator = "zhangsan";}/*** 將指定圖標(png圖片)印刷到指定圖片上* <p>* 1.圖標圖片格式:* png* 2.坐標軸:* x軸決定左右位置* y軸決定上下位置* 3.坐標位置* x值越大距離右越近,反之,x值越小距離左越近;* y值越大距離越往下,反之,y值越小距離越往上* </p>** @param pressImg 水印圖片* @param targetImg 源圖片路徑的目標文件* @param x x坐標* @param y y坐標*/public final static void pressImage(String pressImg, String targetImg, int x, int y) {try {// 目標文件File imageFile = new File(targetImg);Image src = ImageIO.read(imageFile);int wideth = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();g.drawImage(src, 0, 0, wideth, height, null);// 水印文件File waterMarkImage = new File(pressImg);Image markImage = ImageIO.read(waterMarkImage);int weightMarkImage = markImage.getWidth(null);int heightMarkImage = markImage.getHeight(null);g.drawImage(markImage, x, y, weightMarkImage, heightMarkImage, null);// 水印結束g.dispose();FileOutputStream out = new FileOutputStream(targetImg);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);encoder.encode(image);out.close();} catch (IOException e) {e.printStackTrace();}}/*** 打印文字水印圖片* <p>* 1.圖標圖片格式:png* 2.坐標軸:* x軸決定左右位置* y軸決定上下位置* 3.坐標位置* x值越大距離右越近,反之,x值越小距離左越近;* y值越大距離越往下,反之,y值越小距離越往上* </p>** @param pressText 文字* @param targetImg 目標圖片* @param fontName 字體名* @param fontStyle 字體樣式* @param color 字體顏色* @param fontSize 字體大小* @param x 偏移量* @param y 偏移量*/public static void pressText(String pressText, String targetImg, String fontName, int fontStyle, Color color,int fontSize, int x, int y) {try {File imageFile = new File(targetImg);Image src = ImageIO.read(imageFile);int weidth = src.getWidth(null);int height = src.getHeight(null);BufferedImage image = new BufferedImage(weidth, height, BufferedImage.TYPE_INT_RGB);Graphics g = image.createGraphics();g.drawImage(src, 0, 0, weidth, height, null);g.setColor(color);g.setFont(new Font(fontName, fontStyle, fontSize));g.drawString(pressText, x, y);g.dispose();FileOutputStream out = new FileOutputStream(targetImg);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);encoder.encode(image);out.close();} catch (IOException e) {e.printStackTrace();}}/*** 添加圖標水印+文字水印** @param srcImgPath 需要處理的源圖片路徑*/public static void iconAndTextWatermark(String srcImgPath) {// 1.添加圖標水印pressImage(WATER_MARKIMG_PATH, srcImgPath, 100, 500);System.out.println("--------------------添加圖標水印 執行完成!--------------------");String date = TimeUtil.getCurrentDate().toString();String time = TimeUtil.getCurrentTime().toString();// 2.添加文字水印 參數根據真實保單圖片進行調整pressText(operator, srcImgPath, "宋體", 0, Color.BLUE, 30, 540, 600);pressText(date, srcImgPath, "宋體", 0, Color.BLUE, 30, 540, 650);pressText(time, srcImgPath, "宋體", 0, Color.BLUE, 30, 540, 700);System.out.println("--------------------添加文字水印 執行完成!--------------------");}/*** 對.jpg圖片文件進行篩選* <p>* 1.使用遞歸遍歷目錄下面的.jpg結尾圖片文件* 2.對篩選通過的文件調用水印文件處理* </p>** @param path* @return*/public static void getFileListNotReturn(String path) {File dir = new File(path);// 該文件目錄下文件全部放入數組File[] files = dir.listFiles();if (files != null) {for (int i = 0; i < files.length; i++) {String fileName = files[i].getName();// 判斷是文件還是文件夾if (files[i].isDirectory()) {// 獲取文件絕對路徑getFileListNotReturn(files[i].getAbsolutePath());// 判斷文件名是否以.jpg結尾} else if (fileName.endsWith(".jpg")) {String strFileName = files[i].getAbsolutePath();System.out.println("文件名:" + strFileName);//對符合條件的文件統一水印處理iconAndTextWatermark(strFileName);} else {continue;}}}}//--------------------------------------------單元測試--------------------------------------------public static void main(String[] args) {String srcImgPath = "D:\\1\\srcImgPath\\";System.out.println("圖片路徑:" + srcImgPath);getFileListNotReturn(srcImgPath);}/*** 特別說明:* 如上面的效果展示的那樣,要想將水印打印到圖片指定位置,進行動態設置的話,需要:</p>* 第一,原圖片大小;</p>* 第二,水印大小;</p>* 滿足這兩個條件才能將水印打印到圖片的指定位置,也就是可以進行動態位移。 </p>* 其中,圖片水印可以進行動態設置,而文字水印則實現不了,因為我們無法獲取文字水印的大小。</p>* 調試水印輸出位置也是個細致活呀。</p>* 另外,水印的偏移量一般情況下均為正值,圖片左上角為起點0,0,不同于數學上的Y軸,向下偏移用正值表示。*/ }二、升級版本
根據圖片的寬度(分辨率)和高度(分辨率),動態改變圖標水印的寬度(分辨率)和高度(分辨率),適配所有的圖片比例
實現原理:
1.圖標水印
找到圖片寬度(分辨率)和高度(分辨率)和圖標水印的寬度(分辨率)和高度(分辨率)的比例關系即可
2.文字水印同理:
找到文字水印寬度(分辨率)和高度(分辨率)和圖標水印的寬度(分辨率)和高度(分辨率)的比例關系即可
測試
只需要傳遞需要添加水印的目錄即可
三、依賴
jimi-1.0.jar jai_imageio.jar jai_core.jar jai_codec-1.1.3.jar下載鏈接:https://download.csdn.net/download/weixin_40816738/46766690
總結
以上是生活随笔為你收集整理的java 批量为图片添加图标水印和文字水印的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE 添加和查看注释
- 下一篇: Git Flow工作流图