!7 static JNavigation nav; static File dataDir; static volatile bool stopRecognizing; p-noconsole { autoRestart(); nav = jnavigation(); frameIcon(#1101244, showMaximizedFrame(nav)); dataDir = javaxDataDir("Screen shots for text recognition"); showButton("Stop recognizing other files", r { stopRecognizing = true; disableButton() }); // Recognize existing & new onNewFileInDirWithExtension(dataDir, ".png", voidfunc(File f) { recognizeFile(f, true) }); for (final File f : sortFilesByDateDesc(listPNGFiles(dataDir))) if (!stopRecognizing) recognizeFile(f, false); } svoid recognizeFile(final File f, bool onTop) { final BufferedImage img = loadBufferedImage(f); print("Recognizing: " + f.getName() + " (" + bufferedImageSizeWithStar(img) + ")"); long time = sysNow(); final L lines = ocr_recognizeMultiLine_scored(img); print(" " + (sysNow()-time) + " ms"); F0 makeComponent = func -> JComponent { final new ImageSurface is; Runnable reRecognize = r { print("Re-recognizing..."); temp tempDisposeWindow(smallLoadingAnim()); replaceCollection(lines, ocr_recognizeMultiLine_scored(img)); is.repaint(); print("Done"); }; final ReliableSingleThread rst = new ReliableSingleThread(reRecognize); is.specialPurposed = true; showImageWithRecognizedTexts(img, is, lines); showImageWithRecognizedTexts_makeTeachable2(img, is, lines, filledSimpleRecognizer_cached(), r { rst.trigger() }); ret jtabs( "Picture", jscroll(is), "Raw", jtextarea(pnlStructToString(lines)) ); }; addToNavPossiblyOnTop(onTop, nav, f.getName(), makeComponent); }