【需求】
从通达信软件截屏下来的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