Java图片加水印

采用Java自带的Image IO

废话不多说,上菜

1.  文字水印

 1 import sun.font.FontDesignMetrics;
 2 
 3 import javax.imageio.ImageIO;
 4 import java.awt.*;
 5 import java.awt.image.BufferedImage;
 6 import java.io.File;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 
10 /**
11  * @Author ChengJianSheng
12  * @Date 2021/6/10
13  */
14 public class WatermarkUtil {
15 
16     public static void main(String[] args) throws IOException {
17         addText("F:/1.jpeg", "我的梦想是成为火影");
18     }
19 
20     /**
21      * 加文字水印
22      * @param srcPath   原文件路径
23      * @param content   文字内容
24      * @throws IOException
25      */
26     public static void addText(String srcPath, String content) throws IOException {
27         //  读取原图片信息
28         BufferedImage srcImage = ImageIO.read(new File(srcPath));
29         int width = srcImage.getWidth();
30         int height = srcImage.getHeight();
31 
32         //  创建画笔,设置绘图区域
33         BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
34         Graphics2D g = bufferedImage.createGraphics();
35         g.drawImage(srcImage, 0, 0, width, height, null);
36 //        g.drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
37 
38         g.setFont(new Font("宋体", Font.PLAIN, 32));
39         g.setColor(Color.RED);
40 
41         //  计算文字长度
42         int len = g.getFontMetrics(g.getFont()).charsWidth(content.toCharArray(), 0, content.length());
43         FontDesignMetrics metrics = FontDesignMetrics.getMetrics(g.getFont());
44         int len2 = metrics.stringWidth(content);
45         System.out.println(len);
46         System.out.println(len2);
47 
48         //  计算文字坐标
49         int x = width - len - 10;
50         int y = height - 20;
51 //        int x = width - 2 * len;
52 //        int y = height - 1 * len;
53 
54         g.drawString(content, x, y);
55 
56         g.dispose();
57 
58         //  输出文件
59         FileOutputStream fos = new FileOutputStream("F:/2.png");
60         ImageIO.write(bufferedImage, "png", fos);
61         fos.flush();
62         fos.close();
63     }
64 
65 }

 

可以设置文字透明度

 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.8f)); 

2.  旋转文字

 1 import sun.font.FontDesignMetrics;
 2 
 3 import javax.imageio.ImageIO;
 4 import java.awt.*;
 5 import java.awt.geom.AffineTransform;
 6 import java.awt.image.BufferedImage;
 7 import java.io.File;
 8 import java.io.FileOutputStream;
 9 import java.io.IOException;
10 
11 /**
12  * @Author ChengJianSheng
13  * @Date 2021/6/10
14  */
15 public class WatermarkUtil {
16 
17     // 水印透明度
18     private static final float alpha = 0.5f;
19     // 水印文字字体
20     private static final Font font = new Font("宋体", Font.BOLD, 30);
21     // 水印文字颜色
22     private static final Color color = Color.RED;
23 
24 
25     public static void main(String[] args) throws IOException {
26         addText("F:/1.jpeg", "图片由木叶村提供,仅供忍者联军使用!");
27     }
28 
29     /**
30      * 加文字水印
31      * @param srcPath   原文件路径
32      * @param content   文字内容
33      * @throws IOException
34      */
35     public static void addText(String srcPath, String content) throws IOException {
36         //  读取原图片信息
37         BufferedImage srcImage = ImageIO.read(new File(srcPath));
38         int width = srcImage.getWidth();
39         int height = srcImage.getHeight();
40 
41         //  创建画笔,设置绘图区域
42         BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
43         Graphics2D g = bufferedImage.createGraphics();
44         g.drawImage(srcImage, 0, 0, width, height, null);
45 //        g.drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
46 
47         //  旋转文字
48         AffineTransform affineTransform = g.getTransform();
49         affineTransform.rotate(Math.toRadians(-30), 0, 0);
50         Font rotatedFont = font.deriveFont(affineTransform);
51 
52         g.setFont(rotatedFont); // 字体
53         g.setColor(color);      // 颜色
54         g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 透明度
55 
56         //  计算文字长度
57         int len = g.getFontMetrics(g.getFont()).charsWidth(content.toCharArray(), 0, content.length());
58         FontDesignMetrics metrics = FontDesignMetrics.getMetrics(g.getFont());
59         int len2 = metrics.stringWidth(content);
60         System.out.println(len);
61         System.out.println(len2);
62 
63         //  计算水印文字坐标
64         int x = width/5;
65         int y = height/3*2;
66 
67         g.drawString(content, x, y);
68 
69         g.dispose();
70 
71         //  输出文件
72         FileOutputStream fos = new FileOutputStream("F:/2.png");
73         ImageIO.write(bufferedImage, "png", fos);
74         fos.flush();
75         fos.close();
76     }
77 
78 }

 

画矩形框

 1 import sun.font.FontDesignMetrics;
 2 
 3 import javax.imageio.ImageIO;
 4 import java.awt.*;
 5 import java.awt.image.BufferedImage;
 6 import java.io.File;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 
10 /**
11  * @Author ChengJianSheng
12  * @Date 2021/6/10
13  */
14 public class WatermarkUtil {
15 
16     // 水印透明度
17     private static final float alpha = 0.5f;
18     // 水印文字字体
19     private static final Font font = new Font("宋体", Font.BOLD, 30);
20     // 水印文字颜色
21     private static final Color color = Color.RED;
22 
23 
24     public static void main(String[] args) throws IOException {
25         addText("F:/1.jpeg", "图片由木叶村提供,仅供忍者联军使用!");
26     }
27 
28     /**
29      * 加文字水印
30      * @param srcPath   原文件路径
31      * @param content   文字内容
32      * @throws IOException
33      */
34     public static void addText(String srcPath, String content) throws IOException {
35         //  读取原图片信息
36         BufferedImage srcImage = ImageIO.read(new File(srcPath));
37         int width = srcImage.getWidth();
38         int height = srcImage.getHeight();
39 
40         //  创建画笔,设置绘图区域
41         BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
42         Graphics2D g = bufferedImage.createGraphics();
43         g.drawImage(srcImage, 0, 0, width, height, null);
44 
45         g.setFont(font); // 字体
46         g.setColor(color);  // 颜色
47         g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 透明度
48 
49         //  计算文字宽高度
50         FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
51         int textWidth = metrics.stringWidth(content);   //  文字宽度
52         int textHeight = metrics.getHeight();   //  文字高度
53 
54         //  计算文字坐标
55         int x = (width - textWidth) / 2;
56         int y = (height + textHeight) / 2;
57         //  写文字
58         g.drawString(content, x, y);
59 
60         //  画矩形
61         int padding = 10; // 内边距
62         g.drawRect(x - padding/2, y - textHeight, textWidth + padding, textHeight + padding);
63 
64         g.dispose();
65 
66         //  输出文件
67         FileOutputStream fos = new FileOutputStream("F:/2.png");
68         ImageIO.write(bufferedImage, "png", fos);
69         fos.flush();
70         fos.close();
71     }
72 
73 }

3.  旋转坐标轴

 1 import sun.font.FontDesignMetrics;
 2 
 3 import javax.imageio.ImageIO;
 4 import java.awt.*;
 5 import java.awt.image.BufferedImage;
 6 import java.io.File;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 
10 /**
11  * @Author ChengJianSheng
12  * @Date 2021/6/10
13  */
14 public class WatermarkUtil {
15 
16     // 水印透明度
17     private static final float alpha = 0.5f;
18     // 水印文字字体
19     private static final Font font = new Font("宋体", Font.BOLD, 30);
20     // 水印文字颜色
21     private static final Color color = Color.RED;
22 
23 
24     public static void main(String[] args) throws IOException {
25         addText("F:/1.jpeg", "图片由木叶村提供,仅供忍者联军使用!");
26     }
27 
28     /**
29      * 加文字水印
30      * @param srcPath   原文件路径
31      * @param content   文字内容
32      * @throws IOException
33      */
34     public static void addText(String srcPath, String content) throws IOException {
35         //  读取原图片信息
36         BufferedImage srcImage = ImageIO.read(new File(srcPath));
37         int width = srcImage.getWidth();
38         int height = srcImage.getHeight();
39 
40         //  创建画笔,设置绘图区域
41         BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
42         Graphics2D g = bufferedImage.createGraphics();
43         g.drawImage(srcImage, 0, 0, width, height, null);
44 
45         g.setFont(font); // 字体
46         g.setColor(color);  // 颜色
47         g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 透明度
48 
49         //  计算文字宽高度
50         FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
51         int textWidth = metrics.stringWidth(content);   //  文字宽度
52         int textHeight = metrics.getHeight();   //  文字高度
53 
54         //  旋转坐标轴
55         g.translate(-width/5, height/4);
56         g.rotate(-30*Math.PI/180);
57 
58         //  计算文字坐标
59         int x = (width - textWidth) / 2;
60         int y = (height + textHeight) / 2;
61         //  写文字
62         g.drawString(content, x, y);
63 
64         //  画矩形
65         int padding = 10; // 内边距
66         g.drawRect(x - padding/2, y - textHeight, textWidth + padding, textHeight + padding);
67 
68         g.dispose();
69 
70         //  输出文件
71         FileOutputStream fos = new FileOutputStream("F:/2.png");
72         ImageIO.write(bufferedImage, "png", fos);
73         fos.flush();
74         fos.close();
75     }
76 
77 }

 

结合下载功能,完整的代码如下:

 1 /**
 2  * 下载
 3  */
 4 @GetMapping("/download")
 5 public void download(@RequestParam("mediaId") String mediaId, HttpServletRequest request, HttpServletResponse response) throws IOException {
 6     SysFile sysFile = sysFileService.getByMediaId(mediaId);
 7     if (null == sysFile) {
 8         throw new IllegalArgumentException("文件不存在");
 9     }
10     String mimeType = request.getServletContext().getMimeType(sysFile.getPath());
11     System.out.println(mimeType);
12     response.setContentType(sysFile.getContentType());
13     response.setHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename=" + URLEncoder.encode(sysFile.getOriginalFilename(), "UTF-8"));
14 //        FileInputStream fis = new FileInputStream(sysFile.getPath());
15     ServletOutputStream sos = response.getOutputStream();
16     WatermarkUtil.addText(sysFile.getPath(), "哈哈哈哈", sos);
17 //        IOUtils.copy(fis, sos);
18 //        IOUtils.closeQuietly(fis);
19     IOUtils.closeQuietly(sos);
20 }

 

 1 
 3 import sun.font.FontDesignMetrics;
 4 
 5 import javax.imageio.ImageIO;
 6 import java.awt.*;
 7 import java.awt.image.BufferedImage;
 8 import java.io.File;
 9 import java.io.IOException;
10 import java.io.OutputStream;
11 
12 /**
13  * @Author ChengJianSheng
14  * @Date 2021/6/10
15  */
16 public class WatermarkUtil {
17 
18     // 水印透明度
19     private static final float alpha = 0.5f;
20     // 水印文字字体
21     private static final Font font = new Font("宋体", Font.BOLD, 30);
22     // 水印文字颜色
23     private static final Color color = Color.RED;
24 
25     /**
26      * 加文字水印
27      * @param srcPath   原文件路径
28      * @param content   文字内容
29      * @throws IOException
30      */
31     public static void addText(String srcPath, String content, OutputStream outputStream) throws IOException {
32         //  读取原图片信息
33         BufferedImage srcImage = ImageIO.read(new File(srcPath));
34         int width = srcImage.getWidth();
35         int height = srcImage.getHeight();
36 
37         //  画板
38         BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
39         //  画笔
40         Graphics2D g = bufferedImage.createGraphics();
41         g.drawImage(srcImage, 0, 0, width, height, null);
42 
43         g.setFont(font); // 字体
44         g.setColor(color);  // 颜色
45         g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 透明度
46 
47         //  计算文字宽高度
48         FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
49         int textWidth = metrics.stringWidth(content);   //  文字宽度
50         int textHeight = metrics.getHeight();   //  文字高度
51 
52         //  旋转坐标轴
53         g.translate(-width/5, height/4);
54         g.rotate(-30*Math.PI/180);
55 
56         //  计算文字坐标
57         int x = (width - textWidth) / 2;
58         int y = (height + textHeight) / 2;
59         //  写文字
60         g.drawString(content, x, y);
61 
62         //  画矩形
63         int padding = 10; // 内边距
64         g.drawRect(x - padding/2, y - textHeight, textWidth + padding, textHeight + padding);
65 
66         g.dispose();
67 
68         //  输出
69         ImageIO.write(bufferedImage, "png", outputStream);
70     }
71 
72 }

 

posted @ 2021-06-11 12:38  废物大师兄  阅读(1436)  评论(0编辑  收藏  举报