【需求】
从通达信软件截屏下来的K线图,在打印前需要反色,打印后需要手动加上当前日期,这些都可以由程序代替手工完成。
以下是期待的效果。
【关键点】
给图片反色用的是梯度法,这个在网络上已有成型代码;
给图片加水印是取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;
}
}
【处理前图片】
【处理后图片】