Java課程設計:捕獲圖片以及識別圖中的文字
阿新 • • 發佈:2019-01-13
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課程設計:捕獲圖片以及識別圖中的文字