记录一次java 使用minio添加水印并上传

给文件添加水印并上传

public R<BladeFile> upload(@RequestParam MultipartFile file, @RequestParam String bucketName) {
    String waterMarkContent = "水印文字";
    String[] waterMarkContents = waterMarkContent.split("\\|\\|");

    String fileName = file.getOriginalFilename();//获取文件名称
    File destFile = new File("D:/upload/" + fileName);//将文件放入文件夹
    if (!destFile.getParentFile().exists()) {//判断路径是否存在
        destFile.getParentFile().mkdirs();//如果没有则创建
    }
    try {
        file.transferTo(destFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
    File originalFile = new File("D:/upload/" + fileName);
    BufferedImage image = ImgUtil.read(originalFile);

    // 创建一个新的图片,用于保存加了水印的图片
    BufferedImage watermarkImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);

    // 在新图片上绘制原图片
    Graphics2D g2d = (Graphics2D) watermarkImage.getGraphics();
    g2d.drawImage(image, 0, 0, null);

    // 设置水印的文字内容和样式
    Font font = new Font("宋体", Font.BOLD, 280);
    g2d.setFont(font);
    g2d.setColor(Color.GRAY);
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
    int srcImgWidth = image.getWidth(null);
    //以图片宽度为度量,设置对应的字体大小
    int fontSize;
    if (srcImgWidth <= 3000) fontSize = 280;
    else fontSize = (int) (srcImgWidth * 0.01);
    // 原图高度
    int srcImgHeight = image.getHeight(null);

    // 设置水印文字字体
    // 设置水印旋转
    g2d.rotate(Math.toRadians(-45), (double) image.getWidth() / 2, (double) image.getHeight() / 2);

    // 获取其中最长的文字水印的大小
    int maxLen = 0;
    int maxHigh = 0;
    for (int i = 0; i < waterMarkContents.length; i++) {
        waterMarkContent = waterMarkContents[i];
        int fontlen = getWatermarkLength(waterMarkContent, g2d);
        if (fontlen >= maxLen) {
            maxLen = fontlen;
        }
        maxHigh = maxHigh + (i + 1) * fontSize + 10;
        break;
    }
    // 文字长度相对于图片宽度应该有多少行
    int line = srcImgWidth * 2 / maxLen;
    int co = srcImgHeight * 2 / maxHigh;

    int yz = 0;
    // 填充Y轴方向
    for (int a = 0; a < co; a++) {
        int t = 0;
        for (int j = 0; j < waterMarkContents.length; j++) {
            waterMarkContent = waterMarkContents[j];
            int y = (j + 1) * fontSize + 10 + t;

            // 文字叠加,自动换行叠加,注意符号
            int tempX = -srcImgWidth / 2;
            int tempY = -srcImgHeight / 2 + y + yz;
            // 单字符长度
            int tempCharLen = 0;
            // 单行字符总长度临时计算
            int tempLineLen = 0;
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < waterMarkContent.length(); i++) {
                char tempChar = waterMarkContent.charAt(i);
                tempCharLen = getCharLen(tempChar, g2d);
                tempLineLen += tempCharLen;

                // 和图片的长度进行对应的比较操作
                if (tempLineLen >= srcImgWidth) {
                    // 长度已经满一行,进行文字叠加
                    g2d.drawString(sb.toString(), tempX, tempY);
                    t = t + fontSize;
                    // 清空内容,重新追加
                    sb.delete(0, sb.length());
                    tempY += fontSize;
                    tempLineLen = 0;
                }
                // 追加字符
                sb.append(tempChar);
            }
            // 填充X轴
            for (int z = 0; z < line; z++) {
                // 最后叠加余下的文字
                g2d.drawString(sb.toString(), tempX, tempY);
                tempX = tempX + maxLen + XMOVE;
            }
        }
        yz = yz + maxHigh + YMOVE;
    }
    // 在新图片上绘制水印
    g2d.drawString("Watermark Text", 100, 100);

    // 保存加了水印的图片
    File watermarkFile = new File("D:/upload/" + fileName);
    ImageIO.write(watermarkImage, "jpg", watermarkFile);

    System.out.println("成功给图片加上水印!");
    BladeFile newfile = minioTemplate.putFile(bucketName, getMultipartFile(watermarkFile));//上传文件
    return R.data(newfile);

}

 工具类和参数

public class WaterMarkUtils {
    private static final int XMOVE = 80;//满屏水印中水印之间的横向间隔
    private static final int YMOVE = 80;//满屏水印中水印之间的纵向间隔
    private static Color color = Color.red;//水印文字颜色
    private static int positionWidth = 150;//单个水印中水印横向位置
    private static int positionHeight = 300;//单个水印中水印纵向位置
    
    
     public int getCharLen(char c, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charWidth(c);
    }

    /**
     * 获取水印文字总长度
     *
     * @paramwaterMarkContent水印的文字
     * @paramg
     * @return水印文字总长度
     */
    public int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }
}  

将file文件转化为MultipartFile类型文件

//将文件转化为MultipartFile类型文件
public static MultipartFile getMultipartFile(File file) {
    FileItem item = new DiskFileItemFactory().createItem("file"
            , MediaType.MULTIPART_FORM_DATA_VALUE
            , true
            , file.getName());
    try (InputStream input = new FileInputStream(file);
         OutputStream os = item.getOutputStream()) {
        // 流转移
        IOUtils.copy(input, os);
    } catch (Exception e) {
        throw new IllegalArgumentException("Invalid file: " + e, e);
    }

    return new CommonsMultipartFile(item);
}

 

引用图片加水印后下载(满屏水印,单个水印,可自定义角度)_watermark image 打全屏水印_骨力的博客-CSDN博客

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
迷你图片批量处理工具,她能够帮您迅速大批量处理您的图片。您只需要将一张或多张图片甚至一个文件夹拖放到添加窗口,即可完成图片的添加,方便好用。 功能概述:批量更改大小、批量图片压缩、批量添加水印、批量更改格式、批量增加特效等。 修订概述: 新增水印图片旋转功能。 新增图片旋转、灰色、反色、模糊、锐化、棕色、红色、绿色、蓝色、青色、品红、黄色等特效处理。 新增图片色相、饱和度、亮度、对比度、阀值等调整功能。 新增以文件名、拍摄时间、当前时间为水印文字的设置。 新增水印文字与水印图片的同时支持。 新增图片裁剪的自定义裁剪位置。 新增添加水印时对小尺寸图片的过滤功能。 新增设置保存功能。 新增水印图片输入框拖拽功能,您可以直接将水印图片拖拽至水印图片文本框。 修正了多文件夹拖拽到添加图片窗体后出现的程序崩溃问题。 修订了图片修改后EXIF信息丢失的问题。 新增图片列表Delete快捷键移除图片功能。 提示:如果您不能正常使用该软件,请安装.NET Framework 2.0, 下载地址:http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=zh-cn 迷你软件系列工具: 迷你图片批量处理工具 迷你文件校验工具 迷你定时提醒工具 迷你词典(MiniDict) Excel数据导出工具 迷你网站检测工具 迷你批量更改文件编码工具 ... 、
你可以使用MinIO Java客户端来实现文件上传和下载。MinIO是一个基于对象存储的开源项目,可以提供高性能的文件存储和访问。 首先,你需要在你的Java项目中添加MinIO Java客户端的依赖。你可以在Maven或者Gradle配置文件中加入以下依赖: Maven: ```xml <dependencies> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.1.0</version> </dependency> </dependencies> ``` Gradle: ```groovy dependencies { implementation 'io.minio:minio:8.1.0' } ``` 接下来,你需要连接到MinIO服务器并进行认证。你可以使用以下代码完成: ```java import io.minio.MinioClient; public class MinioExample { public static void main(String[] args) { try { // 创建MinIO客户端对象 MinioClient minioClient = new MinioClient("http://your-minio-server-url", "access-key", "secret-key"); // 检查存储桶是否存在,如果不存在则创建 boolean isExist = minioClient.bucketExists("your-bucket"); if (!isExist) { minioClient.makeBucket("your-bucket"); } // 上传文件 minioClient.putObject("your-bucket", "your-object-name", "/path/to/your-file"); // 下载文件 minioClient.getObject("your-bucket", "your-object-name", "/path/to/save-file"); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,你需要替换以下参数: - `your-minio-server-url`:MinIO服务器的URL地址。 - `access-key`:你的MinIO访问密钥。 - `secret-key`:你的MinIO密钥。 - `your-bucket`:存储桶的名称。 - `your-object-name`:对象的名称。 - `/path/to/your-file`:待上传的文件路径。 - `/path/to/save-file`:下载文件保存的路径。 通过上述代码,你可以使用MinIO Java客户端实现文件上传和下载。希望对你有帮助!如有任何问题,请随时提出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值