/** * Performs OCR operation. * * @param imageList a list of <code>IIOImage</code> objects * @param rect the bounding rectangle defines the region of the image to be recognized. A * rectangle of zero dimension or <code>null</code> indicates the whole image. * @return the recognized text * @throws TesseractException */ public String doOCR(List<IIOImage> imageList, Rectangle rect) throws TesseractException { init(); setTessVariables(); try { StringBuilder sb = new StringBuilder(); for (IIOImage oimage : imageList) { pageNum++; try { setImage(oimage.getRenderedImage(), rect); sb.append(getOCRText()); } catch (IOException ioe) { // skip the problematic image logger.log(Level.SEVERE, ioe.getMessage(), ioe); } } if (hocr) { sb.insert(0, htmlBeginTag).append(htmlEndTag); } return sb.toString(); } finally { dispose(); } }
// tokenizes a string for PBM and PGM headers and plain PBM and PGM data. If oneChar is true, // then // rather than parsing a whole string, a single character is read (not including whitespace or // comments) static String tokenizeString(InputStream stream, boolean oneChar) throws IOException { final int EOF = -1; StringBuilder b = new StringBuilder(); int c; boolean inComment = false; while (true) { c = stream.read(); if (c == EOF) throw new IOException( "Stream ended prematurely, before table reading was completed."); // no more tokens else if (inComment) { if (c == '\r' || c == '\n') // escape the comment inComment = false; else { } // do nothing } else if (Character.isWhitespace((char) c)) { } // do nothing else if (c == '#') // start of a comment { inComment = true; } else // start of a string { b.append((char) c); break; } } if (oneChar) return b.toString(); // at this point we have a valid string. We read until whitespace or a # while (true) { c = stream.read(); if (c == EOF) break; else if (c == '#') // start of comment, read until a '\n' { while (true) { c = stream.read(); // could hit EOF, which is fine if (c == EOF) break; else if (c == '\r' || c == '\n') break; } // break; // comments are not delimiters } else if (Character.isWhitespace((char) c)) break; else b.append((char) c); } return b.toString(); }
/** * Writes the <code>shape</code>, <code>coords</code>, <code>href</code>, * <code>nohref</code> Attribute for the specified figure and shape. * * @return Returns true, if the polygon is inside of the image bounds. */ private boolean writePolyAttributes(IXMLElement elem, SVGFigure f, Shape shape) { AffineTransform t = TRANSFORM.getClone(f); if (t == null) { t = drawingTransform; } else { t.preConcatenate(drawingTransform); } StringBuilder buf = new StringBuilder(); float[] coords = new float[6]; GeneralPath path = new GeneralPath(); for (PathIterator i = shape.getPathIterator(t, 1.5f); ! i.isDone(); i.next()) { switch (i.currentSegment(coords)) { case PathIterator.SEG_MOVETO : if (buf.length() != 0) { throw new IllegalArgumentException("Illegal shape "+shape); } if (buf.length() != 0) { buf.append(','); } buf.append((int) coords[0]); buf.append(','); buf.append((int) coords[1]); path.moveTo(coords[0], coords[1]); break; case PathIterator.SEG_LINETO : if (buf.length() != 0) { buf.append(','); } buf.append((int) coords[0]); buf.append(','); buf.append((int) coords[1]); path.lineTo(coords[0], coords[1]); break; case PathIterator.SEG_CLOSE : path.closePath(); break; default : throw new InternalError("Illegal segment type "+i.currentSegment(coords)); } } elem.setAttribute("shape", "poly"); elem.setAttribute("coords", buf.toString()); writeHrefAttribute(elem, f); return path.intersects(new Rectangle2D.Float(bounds.x, bounds.y, bounds.width, bounds.height)); }
public void draw(BufferedImage buf) { WritableRaster dst = buf.getRaster(); blit(dst, bg.getRaster(), Coord.z); alphablit(dst, rmeter(sbars[0].getRaster(), lmax[0], max), mc[0]); alphablit( dst, lmeter(sbars[1].getRaster(), lmax[1], max), mc[1].sub(bars[1].getWidth() - 1, 0)); alphablit( dst, lmeter(sbars[2].getRaster(), lmax[2], max), mc[2].sub(bars[2].getWidth() - 1, 0)); alphablit(dst, rmeter(sbars[3].getRaster(), lmax[3], max), mc[3]); if (lfood != null) { double e = foodeff(lfood); alphablit(dst, rgmeter(lfood, e, 0), mc[0]); alphablit(dst, lgmeter(lfood, e, 1), mc[1].sub(bars[1].getWidth() - 1, 0)); alphablit(dst, lgmeter(lfood, e, 2), mc[2].sub(bars[1].getWidth() - 1, 0)); alphablit(dst, rgmeter(lfood, e, 3), mc[3]); } alphablit(dst, rmeter(bars[0].getRaster(), lev[0], max), mc[0]); alphablit(dst, lmeter(bars[1].getRaster(), lev[1], max), mc[1].sub(bars[1].getWidth() - 1, 0)); alphablit(dst, lmeter(bars[2].getRaster(), lev[2], max), mc[2].sub(bars[2].getWidth() - 1, 0)); alphablit(dst, rmeter(bars[3].getRaster(), lev[3], max), mc[3]); StringBuilder tbuf = new StringBuilder(); for (int i = 0; i < 4; i++) tbuf.append( String.format( "%s: %s/%s\n", rnm[i], Utils.fpformat(lev[i], 3, 1), Utils.fpformat(lmax[i], 3, 1))); tooltip = RichText.render(tbuf.toString(), 0).tex(); }
public static String getLines(String s) { StringBuilder sb = new StringBuilder(); int index = 0; for (int i = 1; index != -1; i++) { sb.append(i + "\n"); index = s.indexOf("\n", index + 1); } return sb.toString(); }
public static String inputStreamReaderToString(InputStreamReader in) throws Exception { StringBuilder sb = new StringBuilder(); char[] buf = new char[1025]; while (in.ready()) { sb.append((new String(buf, 0, in.read(buf, 0, 1024))).replaceAll("\r\n", "\n")); } in.close(); String tmp = sb.toString(); while (tmp.contains("\r\n")) { tmp = tmp.replaceAll("\r\n", "\n"); } return tmp; }
private StringBuilder createOutpuFile( int numOfTags, int[] tags, int tagStartIndexForFilename, boolean multiple, int subImageIndex) { final StringBuilder filenameBuilder = new StringBuilder(); int i = tagStartIndexForFilename; while (true) { filenameBuilder.append(names[tags[i]]); if (++i == numOfTags) { break; } else { filenameBuilder.append('.'); } } if (multiple) { filenameBuilder.append('-').append(subImageIndex); } return filenameBuilder.append(".png"); }
public void decode() throws IOException { readTagDescriptors(); final MessageDigest md; try { md = MessageDigest.getInstance("SHA-512"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return; } final ComponentColorModel colorModel = new ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); final int[] bandOffsets = {2, 1, 0, 3}; final Map<String, String> duplicateGuard = new HashMap<String, String>(); final byte[] bytes = data.array(); final int[] tags = new int[8]; final List<String> symLinkCommand = new ArrayList<String>(4); symLinkCommand.add("ln"); symLinkCommand.add("-s"); symLinkCommand.add(null); symLinkCommand.add(null); for (int fileIndex = 0; fileIndex < fileCount; fileIndex++) { data.position(fileDescriptorsOffset + ((4 + 8) * fileIndex)); final int fileDataOffset = data.getInt(); int numOfTags = 8; for (int i = 0; i < 8; i++) { int tag = data.get() & 0xff; if (tag == 0) { numOfTags = i; break; } tags[i] = tag; } data.position(fileDataSectionOffset + fileDataOffset); final int artRows = data.getShort(); final int artColumns = data.getShort(); // skip unknown data.position(data.position() + 28); final int[] subimageOffsets = readNumericArray(9, false); final int[] subimageWidths = readNumericArray(9, true); final int[] subimageHeights = readNumericArray(9, true); assert numOfTags >= 2; final File dir; final int tagStartIndexForFilename; if (numOfTags == 2) { tagStartIndexForFilename = 1; dir = new File(outputDir, names[tags[0]].toString()); } else { tagStartIndexForFilename = 2; dir = new File(outputDir, names[tags[0]] + "/" + names[tags[1]]); } boolean dirCreated = false; final int imageCount = artRows * artColumns; for (int subImageIndex = 0; subImageIndex < imageCount; subImageIndex++) { final int w = subimageWidths[subImageIndex]; final int h = subimageHeights[subImageIndex]; if (w <= 0 || h <= 0) { continue; } final int srcPos = fileDataSectionOffset + fileDataOffset + subimageOffsets[subImageIndex]; final int srcLength = w * h * 4; md.update(bytes, srcPos, srcLength); md.update((byte) w); md.update((byte) h); final String digest = convertToHex(md.digest()); md.reset(); if (!dirCreated) { //noinspection ResultOfMethodCallIgnored dir.mkdirs(); dirCreated = true; } final byte[] bgra = new byte[srcLength]; // cannot pass bytes directly, offset in DataBufferByte is not working System.arraycopy(bytes, srcPos, bgra, 0, bgra.length); BufferedImage image = new BufferedImage( colorModel, (WritableRaster) Raster.createRaster( new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE, w, h, 4, w * 4, bandOffsets), new DataBufferByte(bgra, bgra.length), null), false, null); final StringBuilder outFilename = createOutpuFile( numOfTags, tags, tagStartIndexForFilename, imageCount > 0, subImageIndex); final String oldOutFilename = duplicateGuard.get(digest); if (oldOutFilename == null) { File file = new File(dir, outFilename.toString()); duplicateGuard.put(digest, file.getPath()); ImageIO.write(image, "png", file); } else { symLinkCommand.set(2, oldOutFilename); symLinkCommand.set(3, dir + "/" + outFilename); Process process = new ProcessBuilder(symLinkCommand).start(); try { if (process.waitFor() != 0) { throw new IOException( "Can't create symlink " + symLinkCommand.get(2) + " " + symLinkCommand.get(3)); } } catch (InterruptedException e) { throw new IOException(e); } } } } }