JAVA 实现上传图片添加水印(详细版)(上)

简介: JAVA 实现上传图片添加水印(详细版)

水印工具类

import javax.imageio.ImageIO;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
/**
 * 定义文字加水印
 */
public class ImageWatermarkUtils {
    // 水印字体
    private static final Font FONT = new Font("微软雅黑", Font.PLAIN, 14);
    // 透明度
    private static final AlphaComposite COMPOSITE = AlphaComposite
            .getInstance(AlphaComposite.SRC_OVER, 0.6f);
    // 水印之间的间隔
    private static final int X_MOVE = 150;
    // 水印之间的间隔
    private static final int Y_MOVE = 200;
    /**
     * 打水印(文字)
     *
     * @param srcImgPath       源文件地址
     * @param font             字体
     * @param markContentColor 水印颜色
     * @param waterMarkContent 水印内容
     * @param outImgPath       输出文件的地址
     */
    public static void markWithContent(String srcImgPath, Font font, Color markContentColor,
                                       String waterMarkContent,
                                       String outImgPath) {
        FileOutputStream fos = null;
        try {
            // 读取原图片信息
            File srcFile = new File(srcImgPath);
            File outFile = new File(outImgPath);
            BufferedImage srcImg = ImageIO.read(srcFile);
            // 图片宽、高
            int imgWidth = srcImg.getWidth();
            int imgHeight = srcImg.getHeight();
            // 图片缓存
            BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
            // 创建绘图工具
            Graphics2D graphics = bufImg.createGraphics();
            // 画入原始图像
            graphics.drawImage(srcImg, 0, 0, imgWidth, imgHeight, null);
            // 设置水印颜色
            graphics.setColor(markContentColor);
            // 设置水印透明度
            graphics.setComposite(COMPOSITE);
            // 设置倾斜角度
            graphics.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2,
                    (double) bufImg.getHeight() / 2);
            // 设置水印字体
            graphics.setFont(font);
            // 消除java.awt.Font字体的锯齿
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            int xCoordinate = -imgWidth / 2, yCoordinate;
            // 字体长度
            int markWidth = FONT.getSize() * getTextLength(waterMarkContent);
            // 字体高度
            int markHeight = FONT.getSize();
            // 循环添加水印
            while (xCoordinate < imgWidth * 1.5) {
                yCoordinate = -imgHeight / 2;
                while (yCoordinate < imgHeight * 1.5) {
                    graphics.drawString(waterMarkContent, xCoordinate, yCoordinate);
                    yCoordinate += markHeight + Y_MOVE;
                }
                xCoordinate += markWidth + X_MOVE;
            }
            // 释放画图工具
            graphics.dispose();
            // 输出图片
            fos = new FileOutputStream(outFile);
            ImageIO.write(bufImg, "jpg", fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //计算水印文本长度
    //1、中文长度即文本长度 2、英文长度为文本长度二分之一
    public static int getTextLength(String text) {
        //水印文字长度
        int length = text.length();
        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }
    public static void main(String[] args) {
        ImageWatermarkUtils.markWithContent("J:\\apache-tomcat-7.0.52\\webapps\\uploadimage\\aftersale\\202211071412117038f330-a850-469d-92f3-937f174bfa49.jpg", FONT, Color.darkGray, "ls65535",
                "J:\\apache-tomcat-7.0.52\\webapps\\uploadimage\\aftersale\\202211071412117038f330-a850-469d-92f3-937f174bfa49.jpg");
    }
}

controller层  

import com.lt.crm.common.QsMap;
import com.lt.crm.common.util.ImageWatermarkUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.UUID;
@CrossOrigin
@RestController
@RequestMapping("/UploadFileImage")
@Api(value = "图片", tags = "微信小程序~图片加水印")
public class CustomUploadFileController {
    private static final Font FONT = new Font("微软雅黑", Font.PLAIN, 14);
    /**
     * WeChat 微信小程序 图片上传
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @ApiOperation(value = "图片上传",notes = "UploadPic")
    @RequestMapping(value = "/images", method = {RequestMethod.POST, RequestMethod.GET})
    public QsMap uploadPicture(HttpServletRequest request, HttpServletResponse response) throws IOException {
        QsMap qsMap = new QsMap();
        //获取上传文件的主文件名与扩展名
        MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
        //对应前端的upload的name参数"file"
        MultipartFile multipartFile = req.getFile("file");
        //获取上传时的名称
        String fileName = multipartFile.getOriginalFilename();
        //存放图片的绝对路径
        String realPath = "J:\\apache-tomcat-7.0.52\\webapps\\uploadimage\\aftersale";
        //格式化时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        //System.currentTimeMillis() 是直接调用本地方法,而 new Date().getTime() 确还要创建一个Date对象,降低了效率和占用了内存(虽然损耗很小)。
        String nowTime = sdf.format(System.currentTimeMillis());
        //取得图片的格式后缀
        String originalLastName = multipartFile.getOriginalFilename();
        String picLastName = originalLastName.substring(originalLastName.lastIndexOf("."));
        //判断上传格式
        if(picLastName.equals(".jpg") || picLastName.equals(".gif") || picLastName.equals(".png") || picLastName.equals(".jpeg")){
            try {
                File dir = new File(realPath);
                //如果文件目录不存在,创建文件目录
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                //拼接 名字+时间戳+后缀
                String picName = nowTime + UUID.randomUUID() + picLastName;
                File file = new File(realPath,picName);
                multipartFile.transferTo(file);
                //全路径
                qsMap.put("file","J:\\apache-tomcat-7.0.52\\webapps\\uploadimage\\aftersale\\" + picName);
                //获取上传的图片路径 加水印(尺寸~大小~样式/工具类自行调节)
                ImageWatermarkUtils.markWithContent((String) qsMap.get("file"), FONT, Color.darkGray, "ls65535",
                        (String) qsMap.get("file"));
            } catch (IOException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }else{
            qsMap.put("上传了不合法的图片后缀!",picLastName);
        }
        return qsMap;
    }
}

postman测试

p57q4h244grpg_4f95ac873ad44db58348cf05dfab06ae.png

效果图如下

p57q4h244grpg_5e1fd97f0311485b8c50e5bc78d17ac2.jpg


目录
相关文章
|
1月前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
134 0
|
前端开发 算法 Java
1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
🍅程序员小王的博客:程序员小王的博客 🍅CSDN地址:程序员小王java 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
1720 0
1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
|
9月前
|
Java API 数据安全/隐私保护
Java操作图片进行缩放旋转翻转加水印
Java操作图片进行缩放旋转翻转加水印
88 1
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
620 0
|
10月前
|
Java 数据安全/隐私保护
java如何为图片加水印
java如何为图片加水印
77 0
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
Java
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
188 0
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
384 0
Java实现图书管理系统
|
数据可视化 Java
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
如果要在某一个界面里面添加功能的话,都在一个类中,会显得代码难以阅读,而且修改起来也会很困难,所以我们将游戏主界面、登录界面、以及注册界面都单独编成一个类,每一个类都继承JFrame父类,并且在类中创建方法来来实现页面
506 0
Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
|
数据可视化 Java 容器
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
注意由于我们计步功能的步数要在重写方法中用到,所以不能将初始化语句写在方法体内,而是要写在成员位置。在其名字的时候也要做到“见名知意”,所以我们给它起名字为step
290 0
Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现