当前位置: 首页 > article >正文

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生成,由于项目是之前写的,记不得那篇文章查到的,在此就不著名文章出处。

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

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


http://www.kler.cn/a/421449.html

相关文章:

  • M31系列LoRa分布式IO模块功能简介
  • 【python】列表
  • 计算机网络——不同版本的 HTTP 协议
  • 华为HarmonyOS 让应用快速拥有账号能力 -- 2 获取用户头像昵称
  • 为什么编程语言会设计不可变的对象?字符串不可变?NSString *s = @“hello“变量s是不可变的吗?Rust内部可变性的意义?
  • 【力扣】3274. 检查棋盘方格颜色是否相同
  • 【版本控制】SVN安装到使用一条路讲解
  • 全球【风电叶片专用环氧树脂】市场集中度较高,环氧树脂主要产地在中国、欧洲和美国
  • PyTorch 2.5.1: Bugs修复版发布
  • 论文阅读——量子退火Experimental signature of programmable quantum annealing
  • 常见的数据结构---队列、树与堆的深入剖析
  • 宝塔 8888端口访问被拒绝 腾讯云
  • 【layui】tabs 控件内通过 iframe 加载url 方式渲染tab页面
  • 指针(上)
  • redis签到命令练习
  • Linux学习笔记11 系统启动初始化,服务和进程管理(下)
  • vue3-Import declaration conflicts with local declaration of dayjs
  • SQL面试题——腾讯SQL面试题 连续5天涨幅超过5%的股票
  • mysql的索引在什么情况下会失效?
  • Idea 2024.3 突然出现点击run 运行没有反应,且没有任何提示。
  • 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
  • openEuler 22.03 使用cephadm安装部署ceph集群
  • Go快速入门
  • JAVA设计模式,动态代理模式
  • 【Java基础面试题011】什么是Java中的自动装箱和拆箱?
  • 基于Java Springboot高校社团微信小程序