Java避免重复上传相同图片的解决方案

 更新时间:2025年06月18日 09:30:54   作者:Nicky.Ma  
相信大家也都经历过,前端在一个请求发送后立即禁用掉按钮,这里咱们来讨论一下后端对防止重复提交的处理方式,这篇文章主要介绍了Java避免重复上传相同图片的解决方案,需要的朋友可以参考下

前言

在开发过程中,我们经常会遇到需要上传图片的场景。然而,当接口对上传的图片做了重复限制时,如何有效地对图片进行微调,使其在不改变核心内容的前提下避免被识别为重复图片,成为了一个需要解决的问题。本文将介绍一种通过轻微调整图片大小和添加随机噪声来实现图片微调的方法,并提供相应的 Java 代码示例。

背景

在项目中,我们遇到了一个具体问题:当上传图片时,接口会检查图片是否与已有的图片重复。如果重复,则返回错误码 -2018。为了解决这个问题,我们需要对图片进行微调,使其在技术上不被视为同一张图片,同时保持视觉效果基本不变。

解决方案

我们的解决方案主要包括以下几个步骤:

  • 图片尺寸的轻微调整:通过随机调整图片的宽度和高度,使其与原始图片略有不同。
  • 添加随机噪声:在图片的像素值上添加轻微的随机噪声,进一步减少图片的相似性。
  • 避免影响图片质量:确保微调操作对图片的视觉效果和特征码提取的影响最小化。

下面是具体的代码实现:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ThreadLocalRandom;
import javax.imageio.ImageIO;

private File adjustImage(File originalFile) throws IOException {
    BufferedImage originalImage = ImageIO.read(originalFile);
    if (originalImage == null) {
        throw new IOException("无法读取图像文件");
    }

    // 轻微调整大小
    int widthAdjustment = ThreadLocalRandom.current().nextInt(-2, 3);
    int heightAdjustment = ThreadLocalRandom.current().nextInt(-2, 3);
    int newWidth = Math.max(1, originalImage.getWidth() + widthAdjustment);
    int newHeight = Math.max(1, originalImage.getHeight() + heightAdjustment);

    BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, originalImage.getType());
    resizedImage.getGraphics().drawImage(originalImage.getScaledInstance(newWidth, newHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null);

    // 添加随机噪声
    BufferedImage noisyImage = addOptimizedRandomNoise(resizedImage);

    // 将调整后的图片保存到临时文件
    File adjustedFile = File.createTempFile("adjusted_image", ".jpg");
    ImageIO.write(noisyImage, "jpg", adjustedFile);

    return adjustedFile;
}

private BufferedImage addOptimizedRandomNoise(BufferedImage image) {
    BufferedImage noisyImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            int pixel = image.getRGB(x, y);
            int red = (pixel >> 16) & 0xff;
            int green = (pixel >> 8) & 0xff;
            int blue = pixel & 0xff;

            // 添加随机噪声,范围缩小到-5到5,并且以0为中心对称分布
            red = Math.min(255, Math.max(0, red + ThreadLocalRandom.current().nextInt(-5, 6)));
            green = Math.min(255, Math.max(0, green + ThreadLocalRandom.current().nextInt(-5, 6)));
            blue = Math.min(255, Math.max(0, blue + ThreadLocalRandom.current().nextInt(-5, 6)));

            int newPixel = (pixel & 0xFF000000) | (red << 16) | (green << 8) | blue;
            noisyImage.setRGB(x, y, newPixel);
        }
    }
    return noisyImage;
}

代码说明

  • 图片尺寸调整:通过 ThreadLocalRandom.current().nextInt(-2, 3) 随机生成宽度和高度的调整值,范围在 -2 到 2 之间。这样可以确保调整后的图片尺寸与原始图片非常接近,但又不完全相同。

  • 随机噪声添加:在每个像素的 RGB 值上添加范围在 -5 到 5 之间的随机噪声。这种轻微的噪声不会显著影响图片的视觉效果,但可以有效降低图片的相似性。

  • 保存临时文件:将调整后的图片保存到临时文件中,以便后续上传。

使用场景

这段代码可以在需要上传图片的场景中使用,尤其是在接口对图片重复性有严格限制的情况下。通过微调图片,可以避免因图片重复而导致的上传失败问题。

注意事项

  • 调整范围:根据实际需求,可以调整图片尺寸和噪声的范围。但需要注意,调整范围过大可能会影响图片的视觉效果和特征码提取。
  • 性能优化:图片处理操作可能会增加一定的计算开销,尤其是在处理大量图片时,需要考虑性能优化。
  • 临时文件清理:确保在业务完成后删除临时文件,以避免不必要的文件残留。

通过上述方法,我们成功解决了图片重复上传的问题,同时保持了图片的视觉效果和特征码提取的准确性。希望这篇文章能为遇到类似问题的开发者提供一些参考和帮助。

到此这篇关于Java避免重复上传相同图片的文章就介绍到这了,更多相关Java避免重复上传相同图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现网页爬虫的示例讲解

    java实现网页爬虫的示例讲解

    下面小编就为大家带来一篇java实现网页爬虫的示例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot整合Web之AOP配置详解

    SpringBoot整合Web之AOP配置详解

    面向切面编程(aspect-oriented programming,AOP)主要实现的目的是针对业务处理过程中的切面进行提取,诸如日志、事务管理和安全这样的系统服务,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
    2022-08-08
  • 利用Java对PDF文件进行电子签章的实战过程

    利用Java对PDF文件进行电子签章的实战过程

    随着电子账单、回单、通知、合同的流行,电子文档的可信度变得非常重要,为防止非法篡改,确保文档的权威性,我们可以对PDF进行电子签章,这篇文章主要给大家介绍了关于如何利用Java对PDF文件进行电子签章的相关资料,需要的朋友可以参考下
    2021-07-07
  • SpringBoot中配置AOP详解

    SpringBoot中配置AOP详解

    这篇文章主要介绍了SpringBoot中配置AOP详解,Spring Boot 在Spring 的基础上对AOP的配置提供了自动化配置解决方案spring-boot-starter-aop,使开发者能够更加便捷地在Spring Boot项目中使用AOP,需要的朋友可以参考下
    2024-01-01
  • Spring源码解析 Bean的实例化

    Spring源码解析 Bean的实例化

    这篇文章主要介绍了Spring源码解析 Bean的实例化,文章围绕主题展开详细的内容介绍没具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 解决springboot项目打成jar包后运行时碰到的小坑

    解决springboot项目打成jar包后运行时碰到的小坑

    这篇文章主要介绍了解决springboot项目打成jar包后运行时碰到的小坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Spring Cloud Gateway动态路由Apollo实现详解

    Spring Cloud Gateway动态路由Apollo实现详解

    这篇文章主要为大家介绍了Spring Cloud Gateway动态路由通过Apollo实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • springboot-rabbitmq-reply 消息直接回复模式详情

    springboot-rabbitmq-reply 消息直接回复模式详情

    这篇文章主要介绍了springboot-rabbitmq-reply消息直接回复模式详情,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-09-09
  • SpringBoot获取HttpServletRequest的3种方式总结

    SpringBoot获取HttpServletRequest的3种方式总结

    这篇文章主要给大家介绍了关于SpringBoot获取HttpServletRequest的3种方式,在Spring boot项目中经常要用到Servlet的常用对象如HttpServletRequest request,HttpServletResponse response,HttpSession session,需要的朋友可以参考下
    2023-08-08
  • 如何利用Ganymed SSH-2模拟SSH操作

    如何利用Ganymed SSH-2模拟SSH操作

    这几天看SFTP资料时,无意中看到了Ganymed SSH-2,写了个简单demo,通过,感觉挺好用的,下面就和大家分享下。需要的朋友可以过来参考参考
    2013-08-08

最新评论