目录
一、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生成,由于项目是之前写的,记不得那篇文章查到的,在此就不著名文章出处。
以上根据各位网络大神帮助,结合我项目实战总结。
如果帮助到各位同志,请给点个赞。