【Java/Image】给指定路径下图片反色并加上当前日期形式的水印
【需求】
从通达信软件截屏下来的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
分类:
Java.图像处理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)