diff --git a/src/main/java/info/istlab/Zemi01/App.java b/src/main/java/info/istlab/Zemi01/App.java index ca40701..d10ee8b 100644 --- a/src/main/java/info/istlab/Zemi01/App.java +++ b/src/main/java/info/istlab/Zemi01/App.java @@ -12,7 +12,7 @@ // RectangleFrame.main(null); // ランチャーを起動する場合 - String[] opts = { "RectangleFrame", "TransparentClock", "NumericDemo", "GitFinder" }; + String[] opts = { "OCRFrame", "RectangleFrame", "TransparentClock", "NumericDemo", "GitFinder" }; Launcher.show(opts, null); } diff --git a/src/main/java/info/istlab/Zemi01/OCRFrame.java b/src/main/java/info/istlab/Zemi01/OCRFrame.java new file mode 100644 index 0000000..18858f1 --- /dev/null +++ b/src/main/java/info/istlab/Zemi01/OCRFrame.java @@ -0,0 +1,65 @@ +package info.istlab.Zemi01; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.MouseEvent; + +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; + +public class OCRFrame extends RectangleFrame { + public OCRFrame(int width, int height) { + super(width, height); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + OCRFrame rf = new OCRFrame(400, 300); + rf.setVisible(true); + + JPopupMenu menu = new JPopupMenu(); + JMenuItem cancelMI = new JMenuItem("(close menu)"); // なにもしないメニュー。メニューを閉じるためのメニュー + menu.add(cancelMI); + menu.addSeparator(); + JMenuItem captureMI = new JMenuItem("capture"); + captureMI.addActionListener( + e -> ScreenCapture.capture(rf.getInnerRect(), System.getProperty("user.dir"))); + menu.add(captureMI); + JMenuItem exitMI = new JMenuItem("exit"); + exitMI.addActionListener(e -> System.exit(0)); + menu.add(exitMI); + + rf.registerPopupMenu(menu); + } + }); + } + + // ここで、画面中心にウィンドウ表示するため、いろいろ計算する + public static Point centerOfScreen(Dimension winSize) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + return new Point((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / 2); + } + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + String img = ScreenCapture.getCaptureFileName(this.getInnerRect(), System.getProperty("user.dir")); + System.out.println(img); + // tesseract で画像から文字列を取得する + String text = TesseractOCR.getOCRText(img,"out"); + text = text.replace(" ","").replace("\n",""); + System.out.println(text); + new TextEditor(text); + } + } + + public void setVisible(boolean f) { + for (int i = 0; i < 4; i++) { + rects[i].setVisible(f); + } + super.setVisible(f); + } +} diff --git a/src/main/java/info/istlab/Zemi01/ScreenCapture.java b/src/main/java/info/istlab/Zemi01/ScreenCapture.java index dc23a36..8e9f0db 100644 --- a/src/main/java/info/istlab/Zemi01/ScreenCapture.java +++ b/src/main/java/info/istlab/Zemi01/ScreenCapture.java @@ -13,6 +13,29 @@ import info.istlab.Zemi01.imgview.ImageEditorFrame; public class ScreenCapture { + + public static String getCaptureFileName(Rectangle captureRect, String dirPath) { + File dir = new File(dirPath); + if (!dir.exists()) { + dir.mkdir(); + } + File file = new File(dirPath+ File.separator+"capt.png"); + try { + Robot robot = new Robot(); + BufferedImage screenShot = robot.createScreenCapture(captureRect); + ImageIO.write(screenShot, "png", file); + } catch (Exception e) { + System.out.println("キャプチャの取得に失敗しました。" + e.getMessage()); + } + System.out.println("画面キャプチャを取得しました。" + "\r\n" + file.getPath()); + try { + Desktop.getDesktop().open(file.getParentFile()); + } catch (IOException e) { + e.printStackTrace(); + } + return file.getPath(); + } + public static void capture(Rectangle captureRect, String dirPath) { Toolkit.getDefaultToolkit().beep(); @@ -24,30 +47,8 @@ try { Robot robot = new Robot(); - // // メインウィンドウの右にあることを想定するため、メインウィンドウの位置とサイズを取得 - // Point pos = MainWindow.frame.getLocation(); - // Dimension dim = MainWindow.frame.getSize(); - // Rectangle captureRect = new Rectangle(pos.x + dim.width, pos.y, 564, 322); - // System.out.println(captureRect.toString()); - // Rectangle screenSize = new - // Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); - // Rectangle screenSize = new - // Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); BufferedImage screenShot = robot.createScreenCapture(captureRect); ImageIO.write(screenShot, "png", file); - - - // short[][][] brgb = bufferedImage2ByteArray(screenShot); - // replace(screenShot, brgb); // 水色を黒(0x030303)に変換 - // // うさこれエリアを探索(画像中心から、上下左右にボーダーを探索していく。) - // Rectangle area = getArea(screenShot); - // System.out.println(area.toString()); - // if (area.width == 480 && area.height == 240) { - // byte[][] map = bitmap2map(screenShot, area); - // MainWindow.app.mem.setAry(map); - // MainWindow.app.repaint(); - // } - } catch (Exception e) { System.out.println("キャプチャの取得に失敗しました。" + e.getMessage()); } diff --git a/src/main/java/info/istlab/Zemi01/TesseractOCR.java b/src/main/java/info/istlab/Zemi01/TesseractOCR.java new file mode 100644 index 0000000..9b9ead0 --- /dev/null +++ b/src/main/java/info/istlab/Zemi01/TesseractOCR.java @@ -0,0 +1,49 @@ +package info.istlab.Zemi01; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class TesseractOCR { + public static String getOCRText(String imgpath, String out) { + // コマンドを実行 + // tesseract imgpath stdout + ProcessBuilder pb = new ProcessBuilder("tesseract", "-l","jpn",imgpath, out); + pb.redirectErrorStream(true); + try { + Process p = pb.start(); + p.waitFor(); + } catch (Exception e) { + e.printStackTrace(); + } + // テキストファイルを開く + String text = ""; + try { + text = TesseractOCR.readFile(out + ".txt"); + } catch (IOException e) { + e.printStackTrace(); + } + return text; + + // pb = new ProcessBuilder("open", out + ".txt"); + // pb.redirectErrorStream(true); + // try { + // Process p = pb.start(); + // p.waitFor(); + // } catch (Exception e) { + // e.printStackTrace(); + // } + // return "OCR text"; + } + // ファイルを読み込むメソッド + public static String readFile(String filePath) throws IOException { + StringBuilder content = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { + String line; + while ((line = br.readLine()) != null) { + content.append(line).append(System.lineSeparator()); + } + } + return content.toString(); + } +} diff --git a/src/main/java/info/istlab/Zemi01/TextEditor.java b/src/main/java/info/istlab/Zemi01/TextEditor.java new file mode 100644 index 0000000..88528f9 --- /dev/null +++ b/src/main/java/info/istlab/Zemi01/TextEditor.java @@ -0,0 +1,43 @@ +package info.istlab.Zemi01; + +import java.awt.BorderLayout; +import java.awt.Font; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public class TextEditor extends JFrame { + JTextArea textArea; + JButton copyButton; + + public TextEditor(String text) { + super("TextEditor"); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setSize(600, 400); + + // テキストエリアとスクロールペインを作成 + textArea = new JTextArea(); + textArea.setEditable(false); // 編集不可 + JScrollPane scrollPane = new JScrollPane(textArea); + Font font = new Font("Monospaced", Font.PLAIN, 20); + textArea.setFont(font); + + textArea.setText(text); + textArea.setLineWrap(true); // 折り返し + textArea.setEditable(true); // 編集可能; + + copyButton = new JButton("Copy"); + copyButton.addActionListener(e -> { + textArea.selectAll(); + textArea.copy(); + }); + // フレームに追加 + add(scrollPane, BorderLayout.CENTER); + add(copyButton, BorderLayout.NORTH); + + setLocationRelativeTo(null); + setVisible(true); + } +}