0
点赞
收藏
分享

微信扫一扫

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印

_铁马冰河_ 03-14 08:30 阅读 4

【需求】

从通达信软件截屏下来的K线图,在打印前需要反色,打印后需要手动加上当前日期,这些都可以由程序代替手工完成。

以下是期待的效果。

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印_java

 【关键点】

给图片反色用的是梯度法,这个在网络上已有成型代码;

给图片加水印是取BufferedImage的graphics,然后在上面操作,这个对熟悉graphics的同学自然构不成障碍。

【代码】

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.ByteLookupTable;
import java.awt.image.LookupOp;
import java.io.File;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import javax.imageio.ImageIO;

/**
 * 将指定路径下所有的png文件进行反色处理并加上日期水印
 * @author ufo
 *
 */
public class InversePngAddMark {
    public static void main(String[] args) throws Exception{
        // 预先准备256个颜色梯度的反向表
        byte reverse[] = new byte[256];
        for (int i = 0; i < 256; i++) {
            reverse[i] = (byte) (255 - i);
        }
        
        // 当前日期
        String currDate=getDate();
        
        // 获得指定路径下的所有png文件
        File folder=new File("C:\\Users\\ufo\\Desktop\\");        
        File[] files=folder.listFiles();
        
        for(File f:files) {
            if(f.isFile()) {
                String fname=f.getPath();
                
                if(fname.toLowerCase().endsWith(".png")) {
                    // 读原文件
                    BufferedImage img = ImageIO.read(f);

                    // 得到反色后的图像
                    BufferedImage inversedImg = inverseColor(img,reverse);
                    
                    // 使用graphics对图像进行加水印操作
                    Graphics2D graphics = (Graphics2D) inversedImg.getGraphics();
                    Font font = new Font("Arial", Font.ITALIC, 24);
                    graphics.setFont(font);
                    graphics.setColor(Color.RED);
                    int offsetX=160,offsetY=20;// 文字离右下角偏置距离,这个自行调整
                    graphics.drawString(currDate, inversedImg.getWidth()-offsetX, inversedImg.getHeight()-offsetY);

                    // 写入原文件
                    File outFile = new File(fname);
                    ImageIO.write(inversedImg, "png", outFile);
                }
            }
        }
    }
    
    /**
     * 得到字符串形式的当前日期
     * @return
     */
    private static String getDate() {
        LocalDate today=LocalDate.now();
        DateTimeFormatter format1=DateTimeFormatter.ofPattern("yy.MM.dd");
        return today.format(format1);
    }
    
    /**
     * 返回反色处理后的新图像
     * @param image
     * @return
     */
    private static BufferedImage inverseColor(BufferedImage image,byte[] reverse) {
        ByteLookupTable blut = new ByteLookupTable(0, reverse);
        BufferedImage bimg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
        LookupOp lop = new LookupOp(blut, null);
        lop.filter(image, bimg);

        return bimg;
    }
}

【处理前图片】

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印_Image_02

【处理后图片】

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印_Image_03

END

举报

相关推荐

0 条评论