Java文字识别软件-调用百度ocr实现文字识别

时间:2022-10-19 12:59:40

java_baidu_ocr

Java调用百度OCR文字识别API实现图片文字识别软件

这是一款小巧方便,强大的文字识别软件,由Java编写,配上了窗口界面

调用了百度ocr文字识别API 识别精度高。

完整项目放在GitHub:https://github.com/Ymy214/java_baidu_ocr

更新日志

新的改变 OcrViewer 2.0 更新于 2019.1.18

我对OcrViewer进行了一些功能拓展与界面美化,除了标准的本地图片识别功能,我增加了如下几点新功能,帮助你更方便使用本工具,进而更好地识别图像中的文字:

    1. 全新的界面设计,将会带来全新的使用体验;
    1. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    1. 增加了 截图识别 功能,你可以通过截取图片直接直接进行识别;
    1. 增加了图片预览功能,更加方便进行图文对比,减少容错;
    1. 增加了 清除图片预览 功能,可以清清除览的图片;
    1. 增加了 重新识别 等功能,如果不确定可以多次识别提高识别精确率;

下面是功能以及新界面展示

  • 识别出师表.png
    Java文字识别软件-调用百度ocr实现文字识别
  • 截图出师表 .png识别结果
    Java文字识别软件-调用百度ocr实现文字识别

  • 识别代码.png
    Java文字识别软件-调用百度ocr实现文字识别

  • 代码.png识别结果
    Java文字识别软件-调用百度ocr实现文字识别

  • 识腾讯新闻弹窗.png
    Java文字识别软件-调用百度ocr实现文字识别

  • 腾讯新闻弹窗.png识别结果
    Java文字识别软件-调用百度ocr实现文字识别
  • 软件界面
    Java文字识别软件-调用百度ocr实现文字识别

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);

    }

}

////////////////////////////////////////////////////////////////////////////////////////////////



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();
        }
    }

}

↑↑↑↑↑↑↑↑↑↑↑↑以上为2019.1.18日OcrViewer2.0第二代↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

↓↓↓↓↓↓↓↓↓↓↓↓以下为2019.1.12日OcrViewer1.0第一代↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 打包生成了jar可执行程序
  • 完整项目GitHub地址 新人有帮助有用的话请给个star谢谢了!
  • https://github.com/Ymy214/java_baidu_ocr
  • 识别图一
    Java文字识别软件-调用百度ocr实现文字识别
  • 图一识别结果
    Java文字识别软件-调用百度ocr实现文字识别

  • 识别图二
    Java文字识别软件-调用百度ocr实现文字识别

  • 图二识别结果
    Java文字识别软件-调用百度ocr实现文字识别

  • 识别图三
    Java文字识别软件-调用百度ocr实现文字识别

  • 图三识别结果
    Java文字识别软件-调用百度ocr实现文字识别
  • 软件界面
    Java文字识别软件-调用百度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));

    }

}

完整项目放在GitHub:https://github.com/Ymy214/java_baidu_ocr