Java调用百度OCR文字识别API实现图片文字识别软件
Java调用百度OCR文字识别API实现图片文字识别软件
原创isinple 发布于2019-01-06 13:35:59 阅读数 1296 收藏
展开
java_baidu_ocr
Java调用百度OCR文字识别API实现图片文字识别软件
这是一款小巧方便,强大的文字识别软件,由Java编写,配上了窗口界面
调用了百度ocr文字识别API 识别精度高。
完整项目放在GitHub:https://github.com/Ymy214/java_baidu_ocr
更新日志
新的改变 OcrViewer 2.0 更新于 2019.1.18
我对OcrViewer进行了一些功能拓展与界面美化,除了标准的本地图片识别功能,我增加了如下几点新功能,帮助你更方便使用本工具,进而更好地识别图像中的文字:
全新的界面设计,将会带来全新的使用体验;
在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
增加了 截图识别 功能,你可以通过截取图片直接直接进行识别;
增加了图片预览功能,更加方便进行图文对比,减少容错;
增加了 清除图片预览 功能,可以清清除览的图片;
增加了 重新识别 等功能,如果不确定可以多次识别提高识别精确率;
下面是功能以及新界面展示
识别出师表.png
截图出师表 .png识别结果
识别代码.png
代码.png识别结果
识腾讯新闻弹窗.png
腾讯新闻弹窗.png识别结果
软件界面
Java源代码:
主窗口类 FileChooserOCR2.java
package baiduOcr;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.json.JSONArray;
import org.json.JSONObject;
import com.baidu.aip.ocr.AipOcr;
@SuppressWarnings("serial")
public class FileChooserOCR2 extends JFrame implements ActionListener
{
// 设置APPID/AK/SK
public static final String appId = "15289864";
public static final String apiKey = "j0pj5Y7HVElkLnmn2LEXKeyO";
public static final String secretKey = "FKVbH7EBcGy4DIaqPnXcqE47eACzn2W7";
AipOcr client = new AipOcr(appId, apiKey, secretKey);
JButton open, re0, copy, screen, reset, reocr, b6;
JPanel ocrPanel, pNorth, pSouth, pWest, pEast, pCenter, pCenterLeft, pCenterRight;
JTextArea ocrText;
JLabel previewLabel, printLabel;
ImageIcon defaultPreviewImg;
JScrollPane areaScroll;
String filePath = "./img/preview.jpg";
BufferedImage screenImage;// 用与子窗体给父窗体传值
// 构造方法
public FileChooserOCR2()
{
// 主面板
ocrPanel = new JPanel();
ocrPanel.setLayout(new BorderLayout());
// 各个按钮
open = new JButton("[选择图片>>>文字识别]");
re0 = new JButton("清空");
copy = new JButton("复制");
screen = new JButton("[截图识别]");
reset = new JButton("清除");
reocr = new JButton("重识");
b6 = new JButton("b6");
// 设置各按钮字体
open.setFont(new Font("宋体", Font.BOLD, 18));
screen.setFont(new Font("宋体", Font.BOLD, 18));
copy.setFont(new Font("宋体", Font.BOLD, 18));
re0.setFont(new Font("宋体", Font.BOLD, 18));
reset.setFont(new Font("宋体", Font.BOLD, 18));
reocr.setFont(new Font("宋体", Font.BOLD, 18));
b6.setFont(new Font("宋体", Font.BOLD, 18));
// 图片预览标签以及状态提示标签
defaultPreviewImg = new ImageIcon("./img/preview.jpg");
previewLabel = new JLabel(defaultPreviewImg);
printLabel = new JLabel("输出:");
// 文本域
ocrText = new JTextArea("输出内容。。。");
ocrText.setEditable(true);
ocrText.setVisible(true);
ocrText.setFont(new Font("宋体", Font.BOLD, 18));
// 各方位分面板
pWest = new JPanel(new GridLayout(2, 0));
pEast = new JPanel(new GridLayout(2, 2));
pSouth = new JPanel(new GridLayout(0, 2));
pCenter = new JPanel(new GridLayout(0, 2));
pCenterLeft = new JPanel(new CardLayout());
pCenterRight = new JPanel(new CardLayout());
// 默认预览图片是否伸缩
// previewImg.setImage(previewImg.getImage().getScaledInstance(340,
// 466,Image.SCALE_DEFAULT));
// previewLabel.setIcon(previewImg);
//
// 文本域的滚动条
areaScroll = new JScrollPane(ocrText);
// 设置横向滚动条始终开启
// areaScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
// 设置垂直滚动条始终开启
// areaScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// 设置横向滚动条自动(有需要时)开启
areaScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// 设置垂直滚动条自动(有需要时)开启
areaScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
// 添加监听
open.addActionListener(this);
re0.addActionListener(this);
copy.addActionListener(this);
screen.addActionListener(this);
reset.addActionListener(this);
reocr.addActionListener(this);
// 各组件依次加入相应方位面板
pCenterLeft.add(previewLabel);
// pCenterRight.add(ocrText);
pCenterRight.add(areaScroll);
pWest.add(reocr);
pWest.add(reset);
pSouth.add(screen);
pSouth.add(printLabel);
pCenter.add(pCenterLeft);
pCenter.add(pCenterRight);
pEast.add(copy);
pEast.add(re0);
// 各方位面板加入主面板
ocrPanel.add(open, BorderLayout.NORTH);
ocrPanel.add(pWest, BorderLayout.WEST);
ocrPanel.add(pEast, BorderLayout.EAST);
ocrPanel.add(pCenter, BorderLayout.CENTER);
ocrPanel.add(pSouth, BorderLayout.SOUTH);
ocrPanel.setSize(300, 300);
this.add(ocrPanel);
this.setBounds(400, 200, 900, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == re0)
{
ocrText.setText("已清空内容。。。");
printLabel.setText("输出:已清空内容。。。");
}
if (e.getSource() == copy)
{
String jianqieban = ocrText.getText();
setSysClipboardText(jianqieban);
printLabel.setText("输出:已复制到剪贴板。。。");
}
if (e.getSource() == screen)
{
new ScreenShotTest(this);
// 现已实现为截屏功能, 截屏功能已经封装到一个类文件中,参考的代码
}
if (e.getSource() == reocr)
{
ocrText.setText(imgOcr(filePath));
printLabel.setText("输出:已重新识别。。。");
}
if (e.getSource() == reset)
{
previewLabel.setIcon(defaultPreviewImg);
filePath = "./img/preview.jpg";
printLabel.setText("输出:已清除预览。。。");
}
if (e.getSource() == open)
{
printLabel.setText("输出:选择文件。。。");
System.out.println(e.getSource());
// TODO Auto-generated method stub
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.showDialog(new JLabel(), "选择");
File file = jfc.getSelectedFile();
if (file.isDirectory())
{
System.out.println("(选择目录) $ " + file.getAbsolutePath());
System.out.println("请选择图片。。。");
} else if (file.isFile())
{
filePath = file.getAbsolutePath();
ImageIcon ocrImg = new ImageIcon(filePath);
System.out.println("(选择文件) $ " + filePath);
ocrText.setText("正在识别。。。");
// 缩放后的图片,用到了一个图片缩放算法
ocrImg.setImage(ocrImg.getImage().getScaledInstance(340, 470, Image.SCALE_DEFAULT));
previewLabel.setIcon(ocrImg);
String ocrStr = imgOcr(filePath);
printLabel.setText("输出:正在识别。。。");
ocrText.setText(ocrStr);
printLabel.setText("输出:识别完毕!!!。。。");
}
System.out.println("正在识别>>>" + jfc.getSelectedFile().getName());
}
}
// 复制到剪贴板的方法
public static void setSysClipboardText(String writeMe)
{
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}
// 主方法
public static void main(String[] args)
{
FileChooserOCR2 ocrWin = new FileChooserOCR2();
ocrWin.setVisible(true);
}
/*
* 文字识别方法
*/
public String imgOcr(String imgpath)
{
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("language_type", "CHN_ENG");
options.put("detect_direction", "true");
options.put("detect_language", "true");
options.put("probability", "true");
// 参数为本地路径
JSONObject res = client.basicGeneral(imgpath, options);
// 解析json-------------
JSONArray wordsResult = (JSONArray) res.get("words_result");
String ocrStr = "\n";
for (Object obj : wordsResult)
{
JSONObject jo = (JSONObject) obj;
ocrStr += jo.getString("words") + "\n";
}
// 解析json-------------
return ocrStr;
// return res.toString(2);
}
/*
* 文字识别方法(方法的重载)
*/
public String imgOcr(byte[] imgInbyte)
{
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("language_type", "CHN_ENG");
options.put("detect_direction", "true");
options.put("detect_language", "true");
options.put("probability", "true");
// 参数为二进制数组
JSONObject res = client.basicGeneral(imgInbyte, options);
// 解析json-------------
JSONArray wordsResult = (JSONArray) res.get("words_result");
String ocrStr = "\n";
for (Object obj : wordsResult)
{
JSONObject jo = (JSONObject) obj;
ocrStr += jo.getString("words") + "\n";
}
// 解析json-------------
return ocrStr;
// return res.toString(2);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
截图窗口类 ScreenShotTest.java(参考自:https://www.jb51.net/article/48968.htm)
package baiduOcr;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JToolBar;
import javax.swing.JWindow;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;
public class ScreenShotTest
{
private FileChooserOCR2 superWindow;
public ScreenShotTest(FileChooserOCR2 superWimdow)
{
this.superWindow = superWimdow;
EventQueue.invokeLater(new Runnable() {
@Override
public void run()
{
try
{
new ScreenShotWindow(superWindow);
} catch (AWTException e)
{
e.printStackTrace();
}
}
});
}
}
/*
* 截图窗口
*/
class ScreenShotWindow extends JWindow
{
private int orgx, orgy, endx, endy;
private BufferedImage image = null;
private BufferedImage tempImage = null;
private BufferedImage saveImage = null;
private ToolsWindow tools = null;
private FileChooserOCR2 superWin;
public ScreenShotWindow(FileChooserOCR2 superWindow) throws AWTException
{
this.superWin = superWindow;
// 获取屏幕尺寸
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds(0, 0, d.width, d.height);
// 截取屏幕
Robot robot = new Robot();
image = robot.createScreenCapture(new Rectangle(0, 0, d.width, d.height));
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e)
{
// 鼠标松开时记录结束点坐标,并隐藏操作窗口
orgx = e.getX();
orgy = e.getY();
if (tools != null)
{
tools.setVisible(false);
}
}
@Override
public void mouseReleased(MouseEvent e)
{
// 鼠标松开时,显示操作窗口
if (tools == null)
{
tools = new ToolsWindow(ScreenShotWindow.this, e.getX(), e.getY());
} else
{
tools.setLocation(e.getX(), e.getY());
}
tools.setVisible(true);
tools.toFront();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e)
{
// 鼠标拖动时,记录坐标并重绘窗口
endx = e.getX();
endy = e.getY();
// 临时图像,用于缓冲屏幕区域放置屏幕闪烁
Image tempImage2 = createImage(ScreenShotWindow.this.getWidth(), ScreenShotWindow.this.getHeight());
Graphics g = tempImage2.getGraphics();
g.drawImage(tempImage, 0, 0, null);
int x = Math.min(orgx, endx);
int y = Math.min(orgy, endy);
int width = Math.abs(endx - orgx) + 1;
int height = Math.abs(endy - orgy) + 1;
// 加上1防止width或height0
g.setColor(Color.BLUE);
g.drawRect(x - 1, y - 1, width + 1, height + 1);
// 减1加1都了防止图片矩形框覆盖掉
saveImage = image.getSubimage(x, y, width, height);
g.drawImage(saveImage, x, y, null);
ScreenShotWindow.this.getGraphics().drawImage(tempImage2, 0, 0, ScreenShotWindow.this);
}
});
this.setVisible(true);
}
@Override
public void paint(Graphics g)
{
RescaleOp ro = new RescaleOp(0.8f, 0, null);
tempImage = ro.filter(image, null);
g.drawImage(tempImage, 0, 0, this);
}
// 保存图像到文件
public void saveImage() throws IOException
{
// 先隐藏窗口后台执行,显得程序执行很快
this.setVisible(false);
tools.setVisible(false);
JFileChooser jfc = new JFileChooser();
jfc.setDialogTitle("保存");
// 文件过滤器,用户过滤可选择文件
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG", "jpg");
jfc.setFileFilter(filter);
// 初始化一个默认文件(此文件会生成到桌面上)
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
String fileName = sdf.format(new Date());
File filePath = FileSystemView.getFileSystemView().getHomeDirectory();
File defaultFile = new File(filePath + File.separator + fileName + ".jpg");
jfc.setSelectedFile(defaultFile);
int flag = jfc.showSaveDialog(this);
if (flag == JFileChooser.APPROVE_OPTION)
{
File file = jfc.getSelectedFile();
String path = file.getPath();
// 检查文件后缀,放置用户忘记输入后缀或者输入不正确的后缀
if (!(path.endsWith(".jpg") || path.endsWith(".JPG")))
{
path += ".jpg";
}
// 写入文件
superWin.printLabel.setText("输出:已保存截图!!!");
ImageIO.write(saveImage, "jpg", new File(path));
dispose();
}
}
// 返回截取的图片
public void okImage()
{
this.setVisible(false);
tools.setVisible(false);
superWin.printLabel.setText("输出:识别截图成功!!!");
ByteArrayOutputStream baos = null;
try
{
baos = new ByteArrayOutputStream();
ImageIO.write(saveImage, "jpg", baos);
byte[] imageInByte = baos.toByteArray();// 使用toByteArray()方法转换成字节数组
superWin.ocrText.setText(superWin.imgOcr(imageInByte));
baos.flush();// 会产生IOException异常
} catch (IOException e1)
{
e1.printStackTrace();
} finally
{
try
{
if (baos != null)
{
baos.close();
}
} catch (Exception ex)
{
ex.printStackTrace();
}
}
dispose();
}
/*
* 文字识别方法(方法的重载) 用父窗口类的
*/
/*
* 文字识别方法
*/
}
/*
* 操作窗口
*/
class ToolsWindow extends JWindow implements ActionListener
{
private ScreenShotWindow parent;
JButton saveButton, closeButton, okButton;
public ToolsWindow(ScreenShotWindow parent, int x, int y)
{
this.parent = parent;
this.setLayout(new BorderLayout());
JToolBar toolBar = new JToolBar("Java 截图");
// 保存按钮
saveButton = new JButton("◰");
// 关闭按钮
closeButton = new JButton("✘");
// 选定按钮
okButton = new JButton("✔");
saveButton.addActionListener(this);
closeButton.addActionListener(this);
okButton.addActionListener(this);
toolBar.add(saveButton);
toolBar.add(closeButton);
toolBar.add(okButton);
this.add(toolBar, BorderLayout.NORTH);
this.setLocation(x, y);
this.pack();
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
if (e.getSource() == saveButton)
{
try
{
parent.saveImage();
dispose();
} catch (IOException e1)
{
e1.printStackTrace();
}
}
if (e.getSource() == closeButton)
{
parent.dispose();
dispose();
// System.exit(0);
}
if (e.getSource() == okButton)
{
// 返回选定的图片
parent.okImage();
dispose();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
↑↑↑↑↑↑↑↑↑↑↑↑以上为2019.1.18日OcrViewer2.0第二代↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓↓↓↓↓以下为2019.1.12日OcrViewer1.0第一代↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
打包生成了jar可执行程序
完整项目GitHub地址 新人有帮助有用的话请给个star谢谢了!
https://github.com/Ymy214/java_baidu_ocr
识别图一
图一识别结果
识别图二
图二识别结果
识别图三
图三识别结果
软件界面
Java源代码:
package baiduOcr;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.HashMap;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.json.JSONArray;
import org.json.JSONObject;
import com.baidu.aip.ocr.AipOcr;
@SuppressWarnings("serial")
public class FileChooserOCR extends JFrame implements ActionListener
{
// 设置APPID/AK/SK
public static final String appId = "15289864";
public static final String apiKey = "j0pj5Y7HVElkLnmn2LEXKeyO";
public static final String secretKey = "FKVbH7EBcGy4DIaqPnXcqE47eACzn2W7";
AipOcr client = new AipOcr(appId, apiKey, secretKey);
JButton open, b1, b2, b3;
JPanel ocrPanel;
JTextArea ocrText;
JScrollPane areaScroll;
// 构造方法
public FileChooserOCR()
{
ocrPanel = new JPanel();
ocrPanel.setLayout(new BorderLayout());
open = new JButton("选择图片>>>文字识别");
b1 = new JButton("清空");
b2 = new JButton("复制");
b3 = new JButton("配置");
open.setFont(new Font("宋体", Font.BOLD, 18));
b3.setFont(new Font("宋体", Font.BOLD, 18));
b2.setFont(new Font("宋体", Font.BOLD, 18));
b1.setFont(new Font("宋体", Font.BOLD, 18));
//文本域的滚动条
// areaScroll = new JScrollPane(ocrText);
// areaScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
// areaScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
//添加监听
open.addActionListener(this);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
ocrText = new JTextArea("输出内容。。。");
ocrText.setEditable(true);
ocrText.setVisible(true);
ocrText.setFont(new Font("宋体", Font.BOLD, 18));
ocrPanel.add(open, BorderLayout.NORTH);
ocrPanel.add(b1, BorderLayout.EAST);
ocrPanel.add(b2, BorderLayout.WEST);
ocrPanel.add(b3, BorderLayout.SOUTH);
ocrPanel.add(ocrText, BorderLayout.CENTER);
// ocrPanel.add(areaScroll);
ocrPanel.setSize(300, 300);
this.add(ocrPanel);
this.setBounds(400, 200, 900, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==b1)
{
ocrText.setText("已清空内容。。。");
}
if(e.getSource()==b2)
{
String jianqieban = ocrText.getText();
setSysClipboardText(jianqieban);
}
if (e.getSource()==b3)
{
//日后实现
}
if(e.getSource()==open)
{
System.out.println(e.getSource());
// TODO Auto-generated method stub
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.showDialog(new JLabel(), "选择");
File file = jfc.getSelectedFile();
if (file.isDirectory())
{
System.out.println("(选择目录) $ " + file.getAbsolutePath());
System.out.println("请选择图片。。。");
}
else if (file.isFile())
{
System.out.println("(选择文件) $ " + file.getAbsolutePath());
ocrText.setText("正在识别。。。");
String ocrStr = this.imgOcr(file.getAbsolutePath());
ocrText.setText(ocrStr);
}
System.out.println("正在识别>>>"+jfc.getSelectedFile().getName());
}
}
//复制到剪贴板
public static void setSysClipboardText(String writeMe) {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}
// 主方法
public static void main(String[] args)
{
FileChooserOCR ocrWin = new FileChooserOCR();
ocrWin.setVisible(true);
}
/*
* 文字识别方法
*/
public String imgOcr(String imgpath)
{
// 传入可选参数调用接口
HashMap<String, String> options = new HashMap<String, String>();
options.put("language_type", "CHN_ENG");
options.put("detect_direction", "true");
options.put("detect_language", "true");
options.put("probability", "true");
// 参数为本地路径
JSONObject res = client.basicGeneral(imgpath, options);
//解析json-------------
JSONArray wordsResult = (JSONArray)res.get("words_result");
String ocrStr = "\n";
for(Object obj : wordsResult)
{
JSONObject jo = (JSONObject)obj;
ocrStr += jo.getString("words") + "\n";
}
//解析json-------------
return ocrStr;
// return res.toString(2);
// 参数为二进制数组
// byte[] file = readFile("test.jpg");
// res = client.basicGeneral(file, options);
// System.out.println(res.toString(2));
// 通用文字识别, 图片参数为远程url图片
// JSONObject res = client.basicGeneralUrl(url, options);
// System.out.println(res.toString(2));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
完整项目放在GitHub:https://github.com/Ymy214/java_baidu_ocr
————————————————
版权声明:本文为CSDN博主「isinple」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/isinple/article/details/85924261
浙公网安备 33010602011771号