1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class JunitImage { @Test public void testImage(){ markImageByText( "hello world" , "D:/1.jpg" , "D:2.jpg" , 45 , new Color( 0 , 0 , 0 ), "JPG" ); } /** * 给图片添加水印文字、可设置水印文字的旋转角度 * @param logoText 要写入的文字 * @param srcImgPath 源图片路径 * @param newImagePath 新图片路径 * @param degree 旋转角度 * @param color 字体颜色 * @param formaName 图片后缀 */ public static void markImageByText(String logoText, String srcImgPath,String newImagePath,Integer degree,Color color,String formaName) { InputStream is = null ; OutputStream os = null ; try { // 1、源图片 java.awt.Image srcImg = ImageIO.read( new File(srcImgPath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth( null ),srcImg.getHeight( null ), BufferedImage.TYPE_INT_RGB); // 2、得到画笔对象 Graphics2D g = buffImg.createGraphics(); // 3、设置对线段的锯齿状边缘处理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(srcImg.getScaledInstance(srcImg.getWidth( null ), srcImg.getHeight( null ), java.awt.Image.SCALE_SMOOTH), 0 , 0 , null ); // 4、设置水印旋转 if ( null != degree) { g.rotate(Math.toRadians(degree), buffImg.getWidth()/ 2 ,buffImg.getHeight() / 2 ); } // 5、设置水印文字颜色 g.setColor(color); // 6、设置水印文字Font g.setFont( new java.awt.Font( "宋体" , java.awt.Font.BOLD, buffImg.getHeight() / 2 )); // 7、设置水印文字透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0 .15f)); // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) g.drawString(logoText, buffImg.getWidth()/ 2 , buffImg.getHeight()/ 2 ); // 9、释放资源 g.dispose(); // 10、生成图片 os = new FileOutputStream(newImagePath); ImageIO.write(buffImg, formaName, os); } catch (Exception e) { e.printStackTrace(); } finally { try { if ( null != is) is.close(); } catch (Exception e) { e.printStackTrace(); } try { if ( null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架