/* @see loci.formats.FormatReader#initFile(String) */ protected void initFile(String id) throws FormatException, IOException { super.initFile(id); reader = new ImageReader(); reader.setMetadataOptions(getMetadataOptions()); reader.setMetadataFiltered(isMetadataFiltered()); reader.setOriginalMetadataPopulated(isOriginalMetadataPopulated()); reader.setNormalized(isNormalized()); reader.setMetadataStore(getMetadataStore()); // NB: We need a raw handle on the ZIP data itself, not a ZipHandle. IRandomAccess rawHandle = Location.getHandle(id, false, false); in = new RandomAccessInputStream(rawHandle, id); ZipInputStream zip = new ZipInputStream(in); while (true) { ZipEntry ze = zip.getNextEntry(); if (ze == null) break; ZipHandle handle = new ZipHandle(id, ze); Location.mapFile(ze.getName(), handle); mappedFiles.add(ze.getName()); } ZipHandle base = new ZipHandle(id); reader.setId(base.getEntryName()); metadataStore = reader.getMetadataStore(); core = reader.getCoreMetadata(); metadata = reader.getGlobalMetadata(); base.close(); }
/* @see IFormatHandler#setId(String) */ public void setId(String id) throws FormatException, IOException { try { super.setId(id); } catch (CMMException e) { // strip out all but the first application marker // ImageIO isn't too keen on supporting multiple application markers // in the same stream, as evidenced by: // // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6488904 in = new RandomAccessInputStream(id); ByteArrayOutputStream v = new ByteArrayOutputStream(); byte[] tag = new byte[2]; in.read(tag); v.write(tag); in.read(tag); int tagValue = DataTools.bytesToShort(tag, false) & 0xffff; boolean appNoteFound = false; while (tagValue != 0xffdb) { if (!appNoteFound || (tagValue < 0xffe0 && tagValue >= 0xfff0)) { v.write(tag); in.read(tag); int len = DataTools.bytesToShort(tag, false) & 0xffff; byte[] tagContents = new byte[len - 2]; in.read(tagContents); v.write(tag); v.write(tagContents); } else { in.read(tag); int len = DataTools.bytesToShort(tag, false) & 0xffff; in.skipBytes(len - 2); } if (tagValue >= 0xffe0 && tagValue < 0xfff0 && !appNoteFound) { appNoteFound = true; } in.read(tag); tagValue = DataTools.bytesToShort(tag, false) & 0xffff; } v.write(tag); byte[] remainder = new byte[(int) (in.length() - in.getFilePointer())]; in.read(remainder); v.write(remainder); ByteArrayHandle bytes = new ByteArrayHandle(v.toByteArray()); Location.mapFile(currentId + ".fixed", bytes); super.setId(currentId + ".fixed"); } if (getSizeX() > MAX_SIZE && getSizeY() > MAX_SIZE && !legacyReaderInitialized) { close(); useLegacy = true; super.setId(id); } currentId = id; }
/* @see loci.formats.IFormatReader#close(boolean) */ public void close(boolean fileOnly) throws IOException { super.close(fileOnly); if (reader != null) reader.close(fileOnly); if (!fileOnly) reader = null; for (String name : mappedFiles) { IRandomAccess handle = Location.getMappedFile(name); Location.mapFile(name, null); if (handle != null) { handle.close(); } } mappedFiles.clear(); }
public static void main(String[] args) throws DependencyException, FormatException, IOException, ServiceException { if (args.length < 1) { System.out.println("Please specify a (small) image file."); System.exit(1); } String path = args[0]; // read in entire file System.out.println("Reading file into memory from disk..."); File inputFile = new File(path); int fileSize = (int) inputFile.length(); DataInputStream in = new DataInputStream(new FileInputStream(inputFile)); byte[] inBytes = new byte[fileSize]; in.readFully(inBytes); System.out.println(fileSize + " bytes read."); // determine input file suffix String fileName = inputFile.getName(); int dot = fileName.lastIndexOf("."); String suffix = dot < 0 ? "" : fileName.substring(dot); // map input id string to input byte array String inId = "inBytes" + suffix; Location.mapFile(inId, new ByteArrayHandle(inBytes)); // read data from byte array using ImageReader System.out.println(); System.out.println("Reading image data from memory..."); ServiceFactory factory = new ServiceFactory(); OMEXMLService service = factory.getInstance(OMEXMLService.class); IMetadata omeMeta = service.createOMEXMLMetadata(); ImageReader reader = new ImageReader(); reader.setMetadataStore(omeMeta); reader.setId(inId); int seriesCount = reader.getSeriesCount(); int imageCount = reader.getImageCount(); int sizeX = reader.getSizeX(); int sizeY = reader.getSizeY(); int sizeZ = reader.getSizeZ(); int sizeC = reader.getSizeC(); int sizeT = reader.getSizeT(); // output some details System.out.println("Series count: " + seriesCount); System.out.println("First series:"); System.out.println("\tImage count = " + imageCount); System.out.println("\tSizeX = " + sizeX); System.out.println("\tSizeY = " + sizeY); System.out.println("\tSizeZ = " + sizeZ); System.out.println("\tSizeC = " + sizeC); System.out.println("\tSizeT = " + sizeT); // map output id string to output byte array String outId = fileName + ".ome.tif"; ByteArrayHandle outputFile = new ByteArrayHandle(); Location.mapFile(outId, outputFile); // write data to byte array using ImageWriter System.out.println(); System.out.print("Writing planes to destination in memory: "); ImageWriter writer = new ImageWriter(); writer.setMetadataRetrieve(omeMeta); writer.setId(outId); byte[] plane = null; for (int i = 0; i < imageCount; i++) { if (plane == null) { // allow reader to allocate a new byte array plane = reader.openBytes(i); } else { // reuse previously allocated byte array reader.openBytes(i, plane); } writer.saveBytes(i, plane); System.out.print("."); } reader.close(); writer.close(); System.out.println(); byte[] outBytes = outputFile.getBytes(); outputFile.close(); // flush output byte array to disk System.out.println(); System.out.println("Flushing image data to disk..."); File outFile = new File(fileName + ".ome.tif"); DataOutputStream out = new DataOutputStream(new FileOutputStream(outFile)); out.write(outBytes); out.close(); }
private byte[] decodeTile(int no, int row, int col) throws FormatException, IOException { if (tileMap[getCoreIndex()] == null) { return new byte[getTileSize()]; } int[] zct = getZCTCoords(no); TileCoordinate t = new TileCoordinate(nDimensions[getCoreIndex()]); t.coordinate[0] = col; t.coordinate[1] = row; for (String dim : dimensionOrdering.keySet()) { int index = dimensionOrdering.get(dim) + 2; if (dim.equals("Z")) { t.coordinate[index] = zct[0]; } else if (dim.equals("C")) { t.coordinate[index] = zct[1]; } else if (dim.equals("T")) { t.coordinate[index] = zct[2]; } } Integer index = (Integer) tileMap[getCoreIndex()].get(t); if (index == null) { return new byte[getTileSize()]; } Long offset = tileOffsets[getCoreIndex()][index]; RandomAccessInputStream ets = new RandomAccessInputStream(usedFiles[getCoreIndex()]); ets.seek(offset); CodecOptions options = new CodecOptions(); options.interleaved = isInterleaved(); options.littleEndian = isLittleEndian(); int tileSize = getTileSize(); if (tileSize == 0) { tileSize = tileX[getCoreIndex()] * tileY[getCoreIndex()] * 10; } options.maxBytes = (int) (offset + tileSize); byte[] buf = null; long end = index < tileOffsets[getCoreIndex()].length - 1 ? tileOffsets[getCoreIndex()][index + 1] : ets.length(); IFormatReader reader = null; String file = null; switch (compressionType[getCoreIndex()]) { case RAW: buf = new byte[tileSize]; ets.read(buf); break; case JPEG: Codec codec = new JPEGCodec(); buf = codec.decompress(ets, options); break; case JPEG_2000: codec = new JPEG2000Codec(); buf = codec.decompress(ets, options); break; case PNG: file = "tile.png"; reader = new APNGReader(); case BMP: if (reader == null) { file = "tile.bmp"; reader = new BMPReader(); } byte[] b = new byte[(int) (end - offset)]; ets.read(b); Location.mapFile(file, new ByteArrayHandle(b)); reader.setId(file); buf = reader.openBytes(0); Location.mapFile(file, null); break; } if (reader != null) { reader.close(); } ets.close(); return buf; }