1. 程式人生 > >Java課程設計:捕獲圖片以及識別圖中的文字

Java課程設計:捕獲圖片以及識別圖中的文字

lean 方式 最簡 文件名 println otf jpeg robot nap

本人承接各種高校C語言、C++、Java語言等課程設計以及ppt等制造,有需要的私信我或者微信18476275715

屏幕捕捉工具

要求:

用圖形用戶界面實現。

能實現捕捉屏幕上的圖片、文字,存成圖片和文本文件。

其中的一些包eclipse是沒有的,是需要自己下載導入的,這個大家自己去百度吧,很簡單的。話不多說上代碼。

text.java

package 屏幕捕捉以及識別;
 
import java.awt.Dimension;  //封裝單個對象中組件的高度和寬度
import java.awt.Rectangle;  //指定坐標空間中的一個區域,該區域由Rectangle對象在坐標空間中的(X,Y),其高度和寬度限制
import java.awt.Robot; //此類用於生成本機系統輸入事件,用於測試自動化,自運行演示以及需要鼠標控制的和鍵盤的其它應用程序 import java.awt.Toolkit; //此類是所有Abstract Window Toolkit的所有實際實現的抽象超類,Toolkit類的子類用於將各個組件綁定到特定的本機工具包實現 import java.awt.image.BufferedImage; //BufferedImage子類描述了具有圖像數據的可訪問緩沖區的圖像 import java.text.SimpleDateFormat; //SimpleDateFormat是一個具體的類,用於以區域設置敏感的方式格式化和分析日期
import java.util.Calendar; import javax.imageio.ImageIO; //一個包含靜態便捷方法的類,用於定位ImageReader和ImageWriters,以及執行簡單的編碼和解碼。 import net.sourceforge.tess4j.Tesseract; import javax.imageio.ImageIO; //提供一組靜態方法進行最簡單的圖形I/O操作,可以對一些圖片進行處理(GIF,PNG,JPEG) import java.awt.image.BufferedImage; //將圖片轉換字節數組,BufferedImage可以還原圖片
import java.io.*; //用於圖片和文本保存的 import javax.swing.*; import java.awt.*; public class text { private final static String FORMAT_PNG = "png"; private final static String FORMAT_JPG = "jpg"; static String filePath = "";// 存放路徑 private static String fileName = "GuiCamera_"; // 文件的前綴 private static int serialNum = 0; private static String imageFormat = text.FORMAT_PNG; // 圖像文件的格式 private static Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); //獲取顯示器的大小 /** * 對屏幕進行拍照 snapShot the Gui once */ public static void snapShot() throws Exception { try { // 拷貝屏幕到一個BufferedImage對象screenshot BufferedImage screenshot = (new Robot()).createScreenCapture(new Rectangle(0, 0, (int) d.getWidth(), (int) d.getHeight())); serialNum++; // 根據文件前綴變量和文件格式變量,自動生成文件名 String name=filePath + fileName +"test3."+imageFormat; File f = new File(name); // 將screenshot對象寫入圖像文件 ImageIO.write(screenshot, imageFormat, f); } catch (Exception e) { throw e; } } /** * * @param srImage 圖片路徑 * @param ZH_CN 是否使用中文訓練庫,true-是 * @return 識別結果 */ public static String FindOCR(String srImage, boolean ZH_CN) { try { System.out.println("start"); double start=System.currentTimeMillis(); File imageFile = new File(srImage); if (!imageFile.exists()) { return "圖片不存在"; } BufferedImage textImage = ImageIO.read(imageFile); Tesseract instance=Tesseract.getInstance(); instance.setDatapath("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata");//設置訓練庫 if (ZH_CN) instance.setLanguage("chi_sim");//中文識別 String result = null; result = instance.doOCR(textImage); double end=System.currentTimeMillis(); System.out.println("耗時"+(end-start)/1000+" s"); return result; } catch (Exception e) { e.printStackTrace(); return "發生未知錯誤"; } } public static void main(String[] args) throws Exception { text.filePath = "D://"; text.snapShot(); } }
package 屏幕捕捉以及識別;
 
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.*;
import net.sourceforge.tess4j.Tesseract;   
 
public class Main {
    public static void main(String[] args) {
        JFrame f = new JFrame("屏幕捕獲工具");
        final JTextField tf = new JTextField();
        tf.setBounds(50, 50, 150, 20);
        
        JButton b = new JButton("屏幕捕捉");
        b.setBounds(20, 100, 130, 30);
    
        JButton c=new JButton("文字識別");
        c.setBounds(200, 100, 130, 30);
        
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                text.filePath = "D://";    
                try {
                    text.snapShot();
                } catch (Exception e1) {
                    // TODO 自動生成的 catch 塊
                    e1.printStackTrace();
                } 
                tf.setText("操作成功");
                tf.setBackground(Color.cyan);
            }
        });
        c.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                 String result=FindOCR("D:\\GuiCamera_test3.png",true);   //此處判斷是否使用中文訓練庫
                 System.out.println(result);
                 byte []a=result.getBytes();
                 FileOutputStream out = null;
                try {
                    out = new FileOutputStream("D:\\text.txt");
                } catch (FileNotFoundException e1) {
                    // TODO 自動生成的 catch 塊
                    e1.printStackTrace();
                }
                 try {
                    out.write(a);
                } catch (IOException e1) {
                    // TODO 自動生成的 catch 塊
                    e1.printStackTrace();
                }
                 try {
                    out.close();
                } catch (IOException e1) {
                    // TODO 自動生成的 catch 塊
                    e1.printStackTrace();
                }
                tf.setText("操作成功");
                tf.setBackground(Color.cyan);
            }
            public String FindOCR(String srImage, boolean ZH_CN) {
                try {
                    System.out.println("start");
                    double start=System.currentTimeMillis();
                    File imageFile = new File(srImage);
                    if (!imageFile.exists()) {
                        return "圖片不存在";
                    }
                    BufferedImage textImage = ImageIO.read(imageFile);
                    Tesseract instance=Tesseract.getInstance();
                    instance.setDatapath("C:\\Program Files (x86)\\Tesseract-OCR\\tessdata");//設置訓練庫
                    if (ZH_CN)
                        instance.setLanguage("chi_sim");//中文識別
                    String result = null;
                    result = instance.doOCR(textImage);
                    double end=System.currentTimeMillis();
                    System.out.println("耗時"+(end-start)/1000+" s");
                    return result;
                } catch (Exception e) {
                    e.printStackTrace();
                    return "發生未知錯誤";
                }
            }
        });
        f.add(b);
        f.add(c);
        f.add(tf);
        f.setSize(600, 250);
        f.setLocationRelativeTo(null);
    f.setLayout(null);  
    f.setVisible(true);   
}
}  

運行效果還是挺不錯的,這個全屏截圖是最低級的截圖,大家也可以繼續完善代碼,設置成局部截圖;文字識別效果如果大家覺得還不行,大家可以參考一下百度的基於API的文字識別。百度這一塊在國內還是比較??。

Java課程設計:捕獲圖片以及識別圖中的文字