java实现图片文字识别ocr
发布时间 - 2026-01-11 02:48:27 点击率:次最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo

在此之前,使用这个工具需要在本地安装OCR工具:
下面一个是一定要安装的离线包,建议默认安装
上面一个是中文的语言包,如果网络可以FQ的童鞋可以在安装的时候就选择语言包在线安装,有多种语言可供选择,默认只有英文的
exe安装好之后,把上面一个文件拷到安装目录下tessdata文件夹下
如C:\Program Files (x86)\Tesseract-OCR\tessdata下
然后下面两个是可选包,如果图片不做临时文件处理的话,可以不需要带的
首先是一个临时文件生成用的类以防源文件损坏,参考某位博友的例子@Gunner
package org.ink.image.textrz;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Locale;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
public class ImageIOHelper {
private Locale locale=Locale.CHINESE;
/**
* user set locale Construct
* @param locale
*/
public ImageIOHelper(Locale locale){
this.locale=locale;
}
/**
* default construct using default locale Locale.CHINESE
*/
public ImageIOHelper(){
}
/**
* create tempFile of Image in order to prevent damaging original file
* @param imageFile
* @param imageFormat like png,jps .etc
* @return TempFile of Image
* @throws IOException
*/
public File createImage(File imageFile, String imageFormat) throws IOException {
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);
ImageReader reader = readers.next();
ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
reader.setInput(iis);
IIOMetadata streamMetadata = reader.getStreamMetadata();
TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");
ImageWriter writer = writers.next();
BufferedImage bi = reader.read(0);
IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
File tempFile = tempImageFile(imageFile);
ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
writer.setOutput(ios);
writer.write(streamMetadata, image, tiffWriteParam);
ios.close();
iis.close();
writer.dispose();
reader.dispose();
return tempFile;
}
/**
* add suffix to tempfile
* @param imageFile
* @return
* @throws IOException
*/
private File tempImageFile(File imageFile) throws IOException {
String path = imageFile.getPath();
StringBuffer strB = new StringBuffer(path);
strB.insert(path.lastIndexOf('.'),"_text_recognize_temp");
String s=strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");
Runtime.getRuntime().exec("attrib "+"\""+s+"\""+" +H"); //设置文件隐藏
return new File(strB.toString());
}
}
下面是真正识别的内容:
package org.ink.image.textrz;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.jdesktop.swingx.util.OS;
/**
* TEXT Recognize Utils
* @author ink.Flower
*
*/
public class OCRUtil {
private final String LANG_OPTION = "-l"; //英文字母小写l,并非数字1
private final String EOL = System.getProperty("line.separator");
private String tessPath = "C://Program Files (x86)//Tesseract-OCR";//ocr默认安装路径
private String transname="chi_sim";//默认中文语言包,识别中文
/**
* Construct method of OCR ,set Tesseract-OCR install path
* @param tessPath Tesseract-OCR install path
* @param transFileName traningFile name like eng.traineddata
*/
public OCRUtil(String tessPath,String transFileName){
this.tessPath=tessPath;
this.transname=transFileName;
}
/**
* Construct method of OCR,default path is "C://Program Files (x86)//Tesseract-OCR"
*/
public OCRUtil(){ }
public String getTessPath() {
return tessPath;
}
public void setTessPath(String tessPath) {
this.tessPath = tessPath;
}
public String getTransname() {
return transname;
}
public void setTransname(String transname) {
this.transname = transname;
}
public String getLANG_OPTION() {
return LANG_OPTION;
}
public String getEOL() {
return EOL;
}
/**
* recognize text in image
* @param imageFile
* @param imageFormat
* @return text recognized in image
* @throws Exception
*/
public String recognizeText(File imageFile,String imageFormat)throws Exception{
File tempImage = new ImageIOHelper().createImage(imageFile,imageFormat);
return ocrImages(tempImage, imageFile);
}
/**
* recognize text in image
* @param imageFile
* @param imageFormat
* @param locale
* @return text recognized in image
* @throws Exception
*/
public String recognizeText(File imageFile,String imageFormat,Locale locale)throws Exception{
File tempImage = new ImageIOHelper(locale).createImage(imageFile,imageFormat);
return ocrImages(tempImage, imageFile);
}
/**
*
* @param tempImage
* @param imageFile
* @return
* @throws IOException
* @throws InterruptedException
*/
private String ocrImages(File tempImage,File imageFile) throws IOException, InterruptedException{
File outputFile = new File(imageFile.getParentFile(),"output");
Runtime.getRuntime().exec("attrib "+"\""+outputFile.getAbsolutePath()+"\""+" +H"); //设置文件隐藏
StringBuffer strB = new StringBuffer();
List<String> cmd = new ArrayList<String>();
if(OS.isWindowsXP()){
cmd.add(tessPath+"//tesseract");
}else if(OS.isLinux()){
cmd.add("tesseract");
}else{
cmd.add(tessPath+"//tesseract");
}
cmd.add("");
cmd.add(outputFile.getName());
cmd.add(LANG_OPTION);
cmd.add(transname);
ProcessBuilder pb = new ProcessBuilder();
pb.directory(imageFile.getParentFile());
cmd.set(1, tempImage.getName());
pb.command(cmd);
pb.redirectErrorStream(true);
Process process = pb.start();
int w = process.waitFor();
tempImage.delete();//删除临时正在工作文件
if(w==0){
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
String str;
while((str = in.readLine())!=null){
strB.append(str).append(EOL);
}
in.close();
}else{
String msg;
switch(w){
case 1:
msg = "Errors accessing files.There may be spaces in your image's filename.";
break;
case 29:
msg = "Cannot recongnize the image or its selected region.";
break;
case 31:
msg = "Unsupported image format.";
break;
default:
msg = "Errors occurred.";
}
tempImage.delete();
throw new RuntimeException(msg);
}
new File(outputFile.getAbsolutePath()+".txt").delete();
return strB.toString();
}
}
在实验中发现,如果对有多个文字的大图进行直接识别的话,效果可能比较差,所以可以参考另一篇切图的博文,将图片取一块之后再识别
https://www./article/121231.htm ←我是链接
这样成功率会提高很多。
以上为离线识别版本,效率因图而已,具体使用的时候可以总结分析,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# ocr图片文字识别
# ocr文字识别
# ocr识别
# Java使用Tesseract-Ocr识别数字
# Java使用OCR技术识别验证码实现自动化登陆方法
# Java使用Tessdata做OCR图片文字识别的详细思路
# java实现腾讯ocr图片识别接口调用
# Java中实现OCR识别读取图片中的文字
# 不到十行实现javaCV图片OCR文字识别
# 用Java实现OCR功能揭秘
# java中实现OCR文字提取的几种方法(Tesseract、PaddleOCR及RapidOCR)
# 离线
# 临时文件
# 是一个
# 我是
# 多个
# 在此
# 英文
# 找了
# 不做
# 可选
# 相关资料
# 不需
# 要带
# 使用这个
# 有多种
# 大家多多
# 可供选择
# 装好
# 英文字母
# 有一个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
在Oracle关闭情况下如何修改spfile的参数
Laravel如何生成API文档?(Swagger/OpenAPI教程)
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Android GridView 滑动条设置一直显示状态(推荐)
Laravel如何处理CORS跨域请求?(配置示例)
英语简历制作免费网站推荐,如何将简历翻译成英文?
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
如何在云服务器上快速搭建个人网站?
如何快速搭建虚拟主机网站?新手必看指南
,交易猫的商品怎么发布到网站上去?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何选择PHP开源工具快速搭建网站?
利用vue写todolist单页应用
Android 常见的图片加载框架详细介绍
java ZXing生成二维码及条码实例分享
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
EditPlus中的正则表达式实战(5)
零服务器AI建站解决方案:快速部署与云端平台低成本实践
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
如何有效防御Web建站篡改攻击?
Laravel如何自定义分页视图?(Pagination示例)
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
Python高阶函数应用_函数作为参数说明【指导】
Linux系统运维自动化项目教程_Ansible批量管理实战
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel如何使用Telescope进行调试?(安装和使用教程)
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
iOS发送验证码倒计时应用
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Bootstrap整体框架之JavaScript插件架构
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
在线教育网站制作平台,山西立德教育官网?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
IOS倒计时设置UIButton标题title的抖动问题
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】

