• 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 }
    
  • 相关阅读:
    UML与ER图
    动态规划法求背包问题
    回溯法求解n皇后和迷宫问题
    优先队列和二叉堆
    快排,归并和Shell排序
    关系型数据库设计范式
    Python使用Redis数据库
    Python urllib简单使用
    当SQL UPDATE遇到EXISTS(SELECT ...)时
    关于使用mybatis的一个惨痛教训
  • 原文地址:https://www.cnblogs.com/cjsblog/p/14874647.html
Copyright © 2020-2023  润新知