import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.font.GlyphVector; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; public final class ImageUtils { private static OutputStream output; public static void main(String[] args) throws IOException { BufferedImage bufferedImage = ImageIO.read(new File("C:/Users/leters/Desktop/0823dd54564e9258a03481d59d82d158ccbf4e8c.jpg")); watermark(bufferedImage,"haha"); File newFile = new File("C:/Users/leters/Desktop/WatermarkedImage.jpg"); ImageIO.write(bufferedImage, "jpg", newFile); } private static void watermark(BufferedImage original, String watermarkText) { // create graphics context and enable anti-aliasing Graphics2D g2d = original.createGraphics(); g2d.scale(1, 1); g2d.addRenderingHints( new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); // create watermark text shape for rendering Font font = new Font(Font.DIALOG_INPUT, Font.ITALIC , 28); GlyphVector fontGV = font.createGlyphVector(g2d.getFontRenderContext(), watermarkText); Rectangle size = fontGV.getPixelBounds(g2d.getFontRenderContext(), 8, 8); Shape textShape = fontGV.getOutline(); double textWidth = size.getWidth(); double textHeight = size.getHeight(); AffineTransform rotate45 = AffineTransform.getRotateInstance(Math.PI / 4d); Shape rotatedText = rotate45.createTransformedShape(textShape); // use a gradient that repeats 4 times g2d.setPaint(new GradientPaint(0, 0, new Color(0f, 0f, 0f, 0.1f), original.getWidth() / 2, original.getHeight() / 2, new Color(1f, 1f, 1f, 0.1f))); g2d.setStroke(new BasicStroke(0.5f)); // step in y direction is calc'ed using pythagoras + 5 pixel padding double yStep = Math.sqrt(textWidth * textWidth / 2) + 5; // step over image rendering watermark text for (double x = -textHeight * 3; x < original.getWidth(); x += (textHeight * 3)) { double y = -yStep; for (; y < original.getHeight(); y += yStep) { g2d.draw(rotatedText); g2d.fill(rotatedText); g2d.translate(0, yStep); } g2d.translate(textHeight * 3, -(y + yStep)); } } }
相关推荐
2. **水印类型**:水印分为文字水印、蒙版水印和logo图片水印。文字水印涉及在图像上绘制文字,需要调整字体、颜色、透明度和角度;蒙版水印则是在图像上覆盖一层半透明的图案或颜色;logo图片水印则是将一个图片...
在Java开发中,有时我们需要对各种类型的文档进行保护或标识,这时添加文本水印是一种有效的方法。本教程将详细介绍如何使用Free Spire.Office for Java库为Word、PPT和PDF文档添加文本水印,以及如何利用Apache POI...
### Java通过POI和JXL给Excel动态添加水印 #### 概述 在实际工作中,经常需要对敏感或重要的Excel文件进行保护措施,比如添加水印。这不仅可以增加文档的专业性,还可以作为版权保护的一种手段。本文将详细介绍...
itext5生成PDF(含水印文字及图片)的源代码,操作说明详细,代码完整可用。
最近在做一个食品溯源项目,需要对一些图片加上水印。 注释都在代码里了,有啥想法可以在评论区交流(๑•ᴗ•๑)~ // 水印透明度 private static float alpha = 0.5f; /** * 给图片添加水印图片、可设置水印图片...
总结来说,IText是Java中一个强大且灵活的PDF生成库,通过它可以轻松地创建包含文字、图片和表格的PDF文档。通过理解并实践提供的Demo,你将能够熟练地运用IText进行PDF的生成工作。记住,持续学习和更新库的版本以...