二話不說,直接上代碼, 具體註釋, 代碼裏簡單的有寫: 可以根據我後面給的兩張效果圖進行測試;
demo測試方法: 直接將如下代碼複製到一個java文件中運行main方法即可;
注意: 代碼中標記'todo'的地方自行修改;
package com.example.studybase._03_文件操作;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @use 利用Java代碼給圖片添加文字(透明圖調低點,也可以當做水印)
*/
@Slf4j
public class WaterMarkUtils {
/**
* 編輯圖片,往指定位置添加文字
* @param srcImgPath :源圖片路徑
* @param targetImgPath :保存圖片路徑
* @param list :文字集合
*/
public static void writeImage(String srcImgPath, String targetImgPath, List<ImageDTO> list) {
FileOutputStream outImgStream = null;
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);
for (ImageDTO imgDTO : list) {
g.setColor(imgDTO.getColor()); //根據圖片的背景設置水印顏色
g.setFont(imgDTO.getFont()); //設置字體
g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY()); //畫出水印
}
g.dispose();
// 輸出圖片
outImgStream = new FileOutputStream(targetImgPath);
ImageIO.write(bufImg, "jpg", outImgStream);
} catch (Exception e) {
log.error("==== 系統異常::{} ====",e);
}finally {
try {
if (null != outImgStream){
outImgStream.flush();
outImgStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 創建ImageDTO, 每一個對象,代表在該圖片中要插入的一段文字內容:
* @param text : 文本內容;
* @param color : 字體顏色(前三位)和透明度(第4位,值越小,越透明);
* @param font : 字體的樣式和字體大小;
* @param x : 當前字體在該圖片位置的橫座標;
* @param y : 當前字體在該圖片位置的縱座標;
* @return
*/
private static ImageDTO createImageDTO(String text,Color color,Font font,int x,int y){
ImageDTO imageDTO = new ImageDTO();
imageDTO.setText(text);
imageDTO.setColor(color);
imageDTO.setFont(font);
imageDTO.setX(x);
imageDTO.setY(y);
return imageDTO;
}
/**
* main方法:
* @param args
*/
public static void main(String[] args) {
//=========================================自行發揮================================
//todo 自己真實的地址:(如果項目中使用的阿里雲,則自行改造'writeImage'方法,接受流對象就好了);
String srcImgPath="C:\\Users\\mm\\Desktop\\test.png"; //源圖片地址
String tarImgPath="C:\\Users\\mm\\Desktop\\test1.png"; //目標圖片的地址
//==============================================================================
//獲取數據集合;
ArrayList<ImageDTO> list = new ArrayList<>();
list.add(createImageDTO("2020/02/02/15:30:30",new Color(102,102,102,100),new Font("微軟雅黑", Font.PLAIN, 24), 78, 160));
list.add(createImageDTO("賬戶名稱",new Color(102,102,102,100),new Font("微軟雅黑", Font.PLAIN, 24), 178, 226));
list.add(createImageDTO("1111111",new Color(102,102,102,100),new Font("微軟雅黑", Font.PLAIN, 24), 710, 226));
list.add(createImageDTO("上海銀行",new Color(102,102,102,100),new Font("微軟雅黑", Font.PLAIN, 24), 178, 290));
list.add(createImageDTO("這是用途",new Color(102,102,102,100),new Font("微軟雅黑", Font.PLAIN, 24), 710, 290));
list.add(createImageDTO("¥50.00",new Color(255,59,48),new Font("微軟雅黑", Font.PLAIN, 36), 270, 366));
//操作圖片:
WaterMarkUtils.writeImage(srcImgPath, tarImgPath, list);
//這句代碼,自己項目中可以不用加,在這裏防止main方法報錯的;
System.exit(0);
}
}
/**
* 存放文本內容的類
*/
@Setter
@Getter
class ImageDTO{
//文字內容
private String text;
//字體顏色和透明度
private Color color;
//字體和大小
private Font font;
//所在圖片的x座標
private int x;
//所在圖片的y座標
private int y;
}
執行前的效果:
執行後的效果: