Java 整合图片处理相关一套:传输、保存、重命名、删除、AI图片文字识别、图片映射、vue3裁剪、设置黑白色、设置负片、提高照片品质

目录

一、vue3 axios + spring boot文件传输

二、Java图片保存到本地

三、Java 本地图片重命名

四、Java 删除本地图片

五、 JavaAI图片文字识别

六、Java映射图片地址,前端直接访问图片

七、vue3 图片裁剪

八、Java 设置图片黑白色

九、Java 设置图片负片

十、Java 提高照片品质


一、vue3 axios + spring boot文件传输

前端:

const cutDown = (file)=>{
  console.log("裁剪完成!",file)
  const formData = new FormData();
  formData.append('file', file.file);
  axios.post(import.meta.env.VITE_APP_BASE_API + '/system/images/imgTxt',
  formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  }).then(res=>{
    console.log(res)
    form.value.fileName = res.data.msg
  });

}

这里要注意我们传输过程中获得的file对象里面可能不是后端需要的二进制文件,而是一个大类,因此我们需要将里面的二进制文件取出来进行传输

后端:


import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


@RequiredArgsConstructor
@RestController
@RequestMapping("/system/images")
public class ImageController {

    
    /**
     * 新增图片
     * 
     */
    @PostMapping(value = "/imgTxt")
    public void imgTxt(@RequestParam("file") MultipartFile file) {
        System.out.println(file.getOriginalFilename());
        // 处理你的逻辑
        
    }

}

二、Java图片保存到本地

public void importData(MultipartFile file) {

    try {
        // 图片路径
        String path = "E://...";
        File dest = new File(path);
        // 如果文件存在就删除原来的文件
        if (dest.exists()) {
            dest.delete();
        }
        dest.getParentFile().mkdirs();
        file.transferTo(dest);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

三、Java 本地图片重命名

    /**
     * 修改文件名
     * @param originalFilePath 原始文件路径
     * @param newFileName 新文件名
     */
    public void updateFileName(String originalFilePath, String newFileName) {
        File originalFile = new File(originalFilePath);
        File newFile = new File(originalFile.getParent(), newFileName);
        if (originalFile.exists()) {
            boolean success = originalFile.renameTo(newFile);
            if (success) {
                System.out.println("文件重命名成功: " + newFile.getAbsolutePath());
            } else {
                System.out.println("文件重命名失败。");
            }
        } else {
            System.out.println("原始文件不存在: " + originalFilePath);
        }
    }

四、Java 删除本地图片

    /**
     * 删除图片
     * @param filePath 需要删除的文件路径
     */
    public void deleteImageByPath(String filePath) {
        Path path = Paths.get(filePath);
        if (Files.exists(path) && Files.isRegularFile(path)) {
            try {
                Files.delete(path);
                System.out.println("文件已删除: " + filePath);
            } catch (IOException e) {
                System.err.println("删除文件时出错: " + e.getMessage());
            }
        } else {
            System.out.println("不是一个普通文件: " + filePath);
        }
    }

五、 JavaAI图片文字识别

pom导入


		<!--图片识别文字-->
		<dependency>
			<groupId>net.sourceforge.tess4j</groupId>
			<artifactId>tess4j</artifactId>
			<version>5.7.0</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>2.0.7</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>2.0.7</version>
			<scope>test</scope>
		</dependency>
		<!--图片识别文字-->

代码:

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import java.io.File;

public class MainServer {
   public static void main(String[] args) throws TesseractException {
       long start = System.currentTimeMillis();
       System.out.println("开始OCR文字识图,请稍后...");
       String path = "F:\\IJ\\.Test\\pxh-img-system-v1\\imgAi\\9058b3bff9c64154b0ba11d2c11c34c4.png";
       //加载要识别的图片
       File image = new File(path);
       //设置配置文件夹微视、识别语言、识别模式
       Tesseract tesseract = new Tesseract();
       tesseract.setDatapath("src/main/resources/tessdata");
       //设置识别语言为中文简体,(如果要设置为英文可改为"eng") chi_sim
       tesseract.setLanguage("chi_sim");
       //使用 OSD 进行自动页面分割以进行图像处理
       tesseract.setPageSegMode(1);
       //设置引擎模式是神经网络LSTM引擎
       tesseract.setOcrEngineMode(1);
       //开始识别整张图片中的文字
//       String result = tesseract.doOCR(image, new Rectangle(-0, -0, 700, 400));
       String result = tesseract.doOCR(image);
       long time = System.currentTimeMillis()-start;
       System.out.println("识别结束,耗时:"+time+" 毫秒,识别结果如下:");
       System.out.println();
       System.out.println(result);
   }
}

这里需要一个模型,

模型下载地址:https://github.com/tesseract-ocr/tessdata

模型很多,这里我们用到中文模型即可,想要识别其他语言的同学可以自行百度其他模型对应的文件,然后切换上面的 tesseract.setLanguage("chi_sim"); 中的 chi_sim;

下载好的模型放在项目静态文件路径下:

展示:

图片越清晰识别度越高。

六、Java映射图片地址,前端直接访问图片

import com.pxh.imgSystem.system.service.ConfigService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@RequiredArgsConstructor
public class WebAppConfigurer implements WebMvcConfigurer {


    private final ConfigService configService;
 

    /**
     * 配置本地资源映射
     * 2024.11.22/楼道/1be227292ceff922.jpg
     *
     * @Param:
     * @Return:
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String directoryPath = configService.getConfigValue("pan.file.path");
        String resourcePath  = configService.getConfigValue("pan.file.mappingPath");
        String file_path = "file:"+directoryPath+"\\";  //本地测试配置
        System.out.println("配置本地资源映射启动成功:"+file_path + " - "+resourcePath);
        registry.addResourceHandler(resourcePath+"/**")  //请求路径
                .addResourceLocations(file_path);        //本地地址
    }
}

这里我用了配置管理,方便上线后修改。

七、vue3 图片裁剪

gitee地址:vue-img-cutter: 简单易用的vue图片裁剪插件,支持移动图像,裁剪图片,放大缩小图片,上下左右移动,固定比例,固定尺寸,远程图片裁剪,只需要很少的代码就可以实现裁剪功能,也可以通过调整参数以适应你自己的业务需求。

下载依赖:

npm install vue-img-cutter
# or
yarn add vue-img-cutter
# or
pnpm add vue-img-cutter

html:

<ImgCutter v-on:cutDown="cutDown" label="识别区域"
            :originalGraph="true"
            :quality="1000" ref="imgCutterModal"></ImgCutter>

js

import ImgCutter from 'vue-img-cutter'
const imgCutterModal = ref(null)

// 将图片转化为路径
const handleCrop = (file)=> {
  let imgurl= window.URL.createObjectURL(file.raw) 
  imgCutterModal.value.handleOpen({
        name:"image.jpg",
        src:imgurl,
  });
}

// 裁剪完成后回调
const cutDown = (file)=>{
  
}

八、Java 设置图片黑白色

    /**
     * 黑白照
     * @param inputFile 需要修改的图片
     * @param newFilePath 修改后图片保存路径
     */
    public static File BlackAndWhite(File inputFile,String newFilePath) {
        try {
            BufferedImage colorImage = ImageIO.read(inputFile);
            BufferedImage blackAndWhiteImage = new BufferedImage(colorImage.getWidth(), colorImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
             ColorConvertOp grayScaleOp = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
             grayScaleOp.filter(colorImage, blackAndWhiteImage);
            File outputFile = new File(newFilePath);
            ImageIO.write(blackAndWhiteImage, "png", outputFile);
            return outputFile;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

九、Java 设置图片负片

/**
     * 负片
     * @param f 需要修改的图片
     * @param newFilePath 修改后图片保存路径
     */
    public static File Negatives(File f,String newFilePath){
        BufferedImage img = null;
        try {
            img = ImageIO.read(f);
        } catch (IOException e) {
            System.out.println(e);
        }
        int width = img.getWidth();
        int height = img.getHeight();
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int p = img.getRGB(x, y);
                int a = (p >> 24) & 0xff;
                int r = (p >> 16) & 0xff;
                int g = (p >> 8) & 0xff;
                int b = p & 0xff;
                r = 255 - r;
                g = 255 - g;
                b = 255 - b;
                p = (a << 24) | (r << 16) | (g << 8) | b;
                img.setRGB(x, y, p);
            }
        }
        try {
            f = new File(newFilePath);
            ImageIO.write(img, getFileExtension(newFilePath), f);
            return f;
        } catch (IOException e) {
            System.out.println(e);
        }
        return null;
    }

十、Java 提高照片品质

导入依赖

<!--提升图片质量-->
		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-all</artifactId>
			<version>5.7.15</version>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>31.0.1-jre</version>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>javacv-platform</artifactId>
			<version>1.5.5</version>
		</dependency>
<!--提升图片质量-->

代码:

import cn.hutool.core.util.IdUtil;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.bytedeco.javacpp.Loader;

import java.io.File;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
/**
   * 修改图片分辨率
   *
   * @param imagePath 原图片地址
   * @param outputDir 输出目录
   * @param width 宽度
   * @param height 高度
   * @return 图片地址
   * @throws Exception 异常
   */
  public static String modifyResolution(
      String imagePath, String outputDir, Integer width, Integer height) throws Exception {
    List<String> paths = Splitter.on(".").splitToList(imagePath);
    String ext = paths.get(paths.size() - 1);
    if (!Arrays.asList("jpg", "png").contains(ext)) {
      throw new Exception("format error");
    }
    String resultPath =
        Joiner.on(File.separator).join(Arrays.asList(outputDir, IdUtil.simpleUUID() + "." + ext));
    String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
    ProcessBuilder builder =
        new ProcessBuilder(
            ffmpeg,
            "-i",
            imagePath,
            "-vf",
            MessageFormat.format("scale={0}:{1}", String.valueOf(width), String.valueOf(height)),
            resultPath);
    builder.inheritIO().start().waitFor();
    return resultPath;
  }

上诉多为转载和AI生成,由于项目是之前写的,记不得那篇文章查到的,在此就不著名文章出处。

以上根据各位网络大神帮助,结合我项目实战总结。

如果帮助到各位同志,请给点个赞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web三、 window对象,延时器,定时器,时间戳,location对象(地址),本地存储-localStorage,数组去重new Set

一、 window对象 window对象 是一个全局对象&#xff0c;也可以说是JavaScript中的 顶级对象 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的 所有通过 var定义 在全局作用域中的 变量 、 函数 都会变成window对象的属…

【AI系统】昇腾异构计算架构 CANN

昇腾异构计算架构 CANN 本文将介绍昇腾 AI 异构计算架构 CANN&#xff08;Compute Architecture for Neural Networks&#xff09;&#xff0c;这是一套为高性能神经网络计算需求专门设计和优化的架构。CANN 包括硬件层面的达芬奇架构和软件层面的全栈支持&#xff0c;旨在提供…

Spark和MapReduce场景应用和区别

文章目录 Spark和MapReduce场景应用和区别一、引言二、MapReduce和Spark的应用场景1. MapReduce的应用场景2. Spark的应用场景 三、MapReduce和Spark的区别1. 内存使用和性能2. 编程模型和易用性3. 实时计算支持 四、使用示例1. MapReduce代码示例2. Spark代码示例 五、总结 Sp…

CSS函数

目录 一、背景 二、函数的概念 1. var()函数 2、calc()函数 三、总结 一、背景 今天我们就来说一说&#xff0c;常用的两个css自定义属性&#xff0c;也称为css函数。本文中就成为css函数。先来看一下官方对其的定义。 自定义属性&#xff08;有时候也被称作CSS 变量或者级…

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中&#xff0c;递归的实现会占用内存栈&#xff08;Call Stack&#xff09;&#xff0c;每次递归调用都会在栈上分配一个新的 “栈帧&#xff08;Stack Frame&#xff09;”&#xff0c;用于存储本次调用的函数局部变量、返回地…

大数据新视界 -- 大数据大厂之 Hive 数据压缩算法对比与选择(下)(20 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【golang】单元测试,以及出现undefined时的解决方案

单元测试 要对某一方法进行测试时&#xff0c;例如如下这一简单减法函数&#xff0c;选中函数名后右键->转到->测试 1&#xff09;Empty test file 就是一个空文件&#xff0c;我们可以自己写测试的逻辑 但是直接点绿色箭头运行会出问题&#xff1a; 找不到包。我们要在…

ETL工具观察:ETLCloud与MDM是什么关系?

一、什么是ETLCloud ETLCloud数据中台是一款高时效的数据集成平台&#xff0c;专注于解决大数据量和高合规要求环境下的数据集成需求。 工具特点 1.离线与实时集成&#xff1a;支持离线数据集成&#xff08;ETL、ELT&#xff09;和变更数据捕获&#xff08;CDC&#xff09;实…

人形机器人训练、机器臂远程操控、VR游戏交互、影视动画制作,一副手套全部解决!

广州虚拟动力基于自研技术推出了多节点mHand Pro动捕数据手套&#xff0c;其最大的特点就是功能集成与高精度捕捉&#xff0c;可以用于人形机器人训练、机器臂远程操控、VR游戏交互、影视动画制作等多种场景。 一、人形机器人训练 mHand Pro动捕数据手套双手共装配16个9轴惯性…

IDL学习笔记(二)IDL处理卫星数据

IDL处理卫星数据 HDF文件数据集属性通用属性 常用HDF4操作函数常用的HDF5操作函数读取HDF文件的一般步骤 HDF4文件读取-----数据信息查询HDF4文件读取示例-----目标数据TIFF输出提取modis产品中数据&#xff0c;与某一点经纬度最接近的点有效结果&#xff0c;并按每行内容为日期…

动态规划-----路径问题

动态规划-----路径问题 下降最小路径和1&#xff1a;状态表示2&#xff1a;状态转移方程3 初始化4 填表顺序5 返回值6 代码实现 总结&#xff1a; 下降最小路径和 1&#xff1a;状态表示 假设&#xff1a;用dp[i][j]表示&#xff1a;到达[i,j]的最小路径 2&#xff1a;状态转…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

2024年大热,Access平替升级方案,也适合Excel用户

欢迎各位看官&#xff0c;您来了&#xff0c;就对了&#xff01; 您多半是Access忠实粉丝&#xff0c;至少是excel用户&#xff0c;亦或是WPS用户吧。那就对了&#xff0c;今天的分享肯定对您有用。 本文1100字&#xff0c;阅读时长2分50秒&#xff01; 现实总是不尽人意&am…

解决idea使用maven打包时无法将本地lib库文件和resource目录中的资源文件打包进jar文件的问题!!!

一、问题复现 1&#xff09;项目结构如下 我们看到项目中手动添加了本地lib资源&#xff0c;同时bootspring的配置文件和mapper文件也放在了resouces目录中。 2&#xff09;上述结构的项目在使用maven打包时&#xff0c;最终生成的jar文件中将不包含lib库文件&#xff0c;甚…

PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型

PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型 目录 PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模…

FPGA实战篇(呼吸灯实验)

1.呼吸灯简介 呼吸灯采用 PWM 的方式&#xff0c;在固定的频率下&#xff0c;通过调整占空比的方式来控制 LED 灯亮度的变化。 PWM&#xff08;Pulse Width Modulation &#xff09;&#xff0c;即脉冲宽度调制&#xff0c;它利用微处理器输出的 PWM 信号&#xff0c;实现对…

家政小程序开发,打造便捷家政生活小程序

目前&#xff0c;随着社会人就老龄化和生活压力的加重&#xff0c;家政服务市场的需求正在不断上升&#xff0c;家政市场的规模也正在逐渐扩大&#xff0c;发展前景可观。 在市场快速发展的影响下&#xff0c;越来越多的企业开始进入到市场中&#xff0c;同时家政市场布局也发…

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

Elasticsearch在liunx 中单机部署

下载配置 1、下载 官网下载地址 2、上传解压 tar -zxvf elasticsearch-XXX.tar.gz 3、新建组和用户 &#xff08;elasticsearch 默认不允许root账户&#xff09; #创建组 es groupadd es #新建用户 useradd ryzhang -g es 4、更改文件夹的用户权限 chown -R ryzhang …

基于 MVC 的 SpringBoot 高校行政事务管理系统:设计思路与实现步骤详解

2系统开发环境 2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…