【需求】
从通达信软件截屏下来的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;} }
【处理前图片】
【处理后图片】
END