Java編輯圖片-添加文字

二話不說,直接上代碼, 具體註釋, 代碼裏簡單的有寫: 可以根據我後面給的兩張效果圖進行測試;

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

執行前的效果:

 執行後的效果:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章