private int validateNImages(FileInfo fi) { File f = new File(fi.directory + fi.fileName); if (!f.exists()) return fi.nImages; long fileLength = f.length(); long bytesPerImage = fi.width*fi.height*fi.getBytesPerPixel(); for (int i=fi.nImages-1; i>=0; i--) { long offset = fi.getOffset() + i*(bytesPerImage+fi.gapBetweenImages); if (offset+bytesPerImage<=fileLength) return i+1; } return fi.nImages; }
private int validateNImages(FileInfo fi) { File f = new File(fi.directory + fi.fileName); if (!f.exists()) return fi.nImages; long fileLength = f.length(); long bytesPerImage = fi.width*fi.height*fi.getBytesPerPixel(); for (int i=fi.nImages-1; i>=0; i--) { long offset = fi.getOffset() + i*(bytesPerImage+fi.gapBetweenImages); if (offset+bytesPerImage<=fileLength) return i+1; } return fi.nImages; }
String getGapInfo(FileInfo[] fi) { if (fi.length<2) return "0"; long minGap = Long.MAX_VALUE; long maxGap = -Long.MAX_VALUE; for (int i=1; i<fi.length; i++) { long gap = fi[i].getOffset()-fi[i-1].getOffset(); if (gap<minGap) minGap = gap; if (gap>maxGap) maxGap = gap; } long imageSize = fi[0].width*fi[0].height*fi[0].getBytesPerPixel(); minGap -= imageSize; maxGap -= imageSize; if (minGap==maxGap) return ""+minGap; else return "varies ("+minGap+" to "+maxGap+")"; }
String getGapInfo(FileInfo[] fi) { if (fi.length<2) return "0"; long minGap = Long.MAX_VALUE; long maxGap = -Long.MAX_VALUE; for (int i=1; i<fi.length; i++) { long gap = fi[i].getOffset()-fi[i-1].getOffset(); if (gap<minGap) minGap = gap; if (gap>maxGap) maxGap = gap; } long imageSize = fi[0].width*fi[0].height*fi[0].getBytesPerPixel(); minGap -= imageSize; maxGap -= imageSize; if (minGap==maxGap) return ""+minGap; else return "varies ("+minGap+" to "+maxGap+")"; }
/** Are all the images in this file the same size and type? */ boolean allSameSizeAndType(FileInfo[] info) { boolean sameSizeAndType = true; boolean contiguous = true; long startingOffset = info[0].getOffset(); int size = info[0].width*info[0].height*info[0].getBytesPerPixel(); for (int i=1; i<info.length; i++) { sameSizeAndType &= info[i].fileType==info[0].fileType && info[i].width==info[0].width && info[i].height==info[0].height; contiguous &= info[i].getOffset()==startingOffset+i*size; } if (contiguous && info[0].fileType!=FileInfo.RGB48) info[0].nImages = info.length; //if (IJ.debugMode) { // IJ.log("sameSizeAndType: " + sameSizeAndType); // IJ.log("contiguous: " + contiguous); //} return sameSizeAndType; }
/** Are all the images in this file the same size and type? */ boolean allSameSizeAndType(FileInfo[] info) { boolean sameSizeAndType = true; boolean contiguous = true; long startingOffset = info[0].getOffset(); int size = info[0].width*info[0].height*info[0].getBytesPerPixel(); for (int i=1; i<info.length; i++) { sameSizeAndType &= info[i].fileType==info[0].fileType && info[i].width==info[0].width && info[i].height==info[0].height; contiguous &= info[i].getOffset()==startingOffset+i*size; } if (contiguous && info[0].fileType!=FileInfo.RGB48) info[0].nImages = info.length; //if (IJ.debugMode) { // IJ.log("sameSizeAndType: " + sameSizeAndType); // IJ.log("contiguous: " + contiguous); //} return sameSizeAndType; }
private byte[] uncompress(byte[] input) { if (fi.compression==FileInfo.PACK_BITS) return packBitsUncompress(input, fi.rowsPerStrip*fi.width*fi.getBytesPerPixel()); else if (fi.compression==FileInfo.LZW || fi.compression==FileInfo.LZW_WITH_DIFFERENCING) return lzwUncompress(input); else if (fi.compression==FileInfo.ZIP) return zipUncompress(input); else return input; }
static void error(String msg, FileInfo fi, long offset, long length) { String msg2 = "FileInfo parameter error. \n" +msg + "\n \n" +" Width: " + fi.width + "\n" +" Height: " + fi.height + "\n" +" Offset: " + offset + "\n" +" Bytes/pixel: " + fi.getBytesPerPixel() + "\n" +(length>0?" File length: " + length + "\n":""); if (silentMode) { IJ.log("Error opening "+fi.directory+fi.fileName); IJ.log(msg2); } else IJ.error("FileOpener", msg2); }
private byte[] uncompress(byte[] input) { if (fi.compression==FileInfo.PACK_BITS) return packBitsUncompress(input, fi.rowsPerStrip*fi.width*fi.getBytesPerPixel()); else if (fi.compression==FileInfo.LZW || fi.compression==FileInfo.LZW_WITH_DIFFERENCING) return lzwUncompress(input); else if (fi.compression==FileInfo.ZIP) return zipUncompress(input); else return input; }
static void error(String msg, FileInfo fi, long offset, long length) { String msg2 = "FileInfo parameter error. \n" +msg + "\n \n" +" Width: " + fi.width + "\n" +" Height: " + fi.height + "\n" +" Offset: " + offset + "\n" +" Bytes/pixel: " + fi.getBytesPerPixel() + "\n" +(length>0?" File length: " + length + "\n":""); if (silentMode) { IJ.log("Error opening "+fi.directory+fi.fileName); IJ.log(msg2); } else IJ.error("FileOpener", msg2); }
static boolean validateFileInfo(File f, FileInfo fi) { long offset = fi.getOffset(); long length = 0; if (fi.width<=0 || fi.height<=0) { error("Width or height <= 0.", fi, offset, length); return false; } if (offset>=0 && offset<1000L) return true; if (offset<0L) { error("Offset is negative.", fi, offset, length); return false; } if (fi.fileType==FileInfo.BITMAP || fi.compression!=FileInfo.COMPRESSION_NONE) return true; length = f.length(); long size = fi.width*fi.height*fi.getBytesPerPixel(); size = fi.nImages>1?size:size/4; if (fi.height==1) size = 0; // allows plugins to read info of unknown length at end of file if (offset+size>length) { error("Offset + image size > file length.", fi, offset, length); return false; } return true; }
static boolean validateFileInfo(File f, FileInfo fi) { long offset = fi.getOffset(); long length = 0; if (fi.width<=0 || fi.height<=0) { error("Width or height <= 0.", fi, offset, length); return false; } if (offset>=0 && offset<1000L) return true; if (offset<0L) { error("Offset is negative.", fi, offset, length); return false; } if (fi.fileType==FileInfo.BITMAP || fi.compression!=FileInfo.COMPRESSION_NONE) return true; length = f.length(); long size = fi.width*fi.height*fi.getBytesPerPixel(); size = fi.nImages>1?size:size/4; if (fi.height==1) size = 0; // allows plugins to read info of unknown length at end of file if (offset+size>length) { error("Offset + image size > file length.", fi, offset, length); return false; } return true; }
private void openAsFileInfoStack(FileInfoVirtualStack stack, String path) { FileInfo[] info = Opener.getTiffFileInfo(path); if (info==null || info.length==0) return; int n =info[0].nImages; if (info.length==1 && n>1) { long size = fi.width*fi.height*fi.getBytesPerPixel(); for (int i=0; i<n; i++) { FileInfo fi = (FileInfo)info[0].clone(); fi.nImages = 1; fi.longOffset = fi.getOffset() + i*(size + fi.gapBetweenImages); stack.addImage(fi); } } else stack.addImage(info[0]); }
private void openAsFileInfoStack(FileInfoVirtualStack stack, String path) { FileInfo[] info = Opener.getTiffFileInfo(path); if (info==null || info.length==0) return; int n =info[0].nImages; if (info.length==1 && n>1) { long size = fi.width*fi.height*fi.getBytesPerPixel(); for (int i=0; i<n; i++) { FileInfo fi = (FileInfo)info[0].clone(); fi.nImages = 1; fi.longOffset = fi.getOffset() + i*(size + fi.gapBetweenImages); stack.addImage(fi); } } else stack.addImage(info[0]); }
if (n<1 || n>fi.nImages) throw new IllegalArgumentException("N out of 1-"+fi.nImages+" range"); long size = fi.width*fi.height*fi.getBytesPerPixel(); fi.longOffset = fi.getOffset() + (n-1)*(size+fi.gapBetweenImages); fi.offset = 0;
if (n<1 || n>fi.nImages) throw new IllegalArgumentException("N out of 1-"+fi.nImages+" range"); long size = fi.width*fi.height*fi.getBytesPerPixel(); fi.longOffset = fi.getOffset() + (n-1)*(size+fi.gapBetweenImages); fi.offset = 0;
if (fi.nImages>1 && fi.virtualStack==null && !(fi.pixels instanceof Object[])) throw new IOException("ImageWriter: fi.pixels not a stack"); if (fi.width*fi.height*fi.getBytesPerPixel()<26214400) showProgressBar = false; // don't show progress bar if image<25MB switch (fi.fileType) {
if (fi.nImages>1 && fi.virtualStack==null && !(fi.pixels instanceof Object[])) throw new IOException("ImageWriter: fi.pixels not a stack"); if (fi.width*fi.height*fi.getBytesPerPixel()<26214400) showProgressBar = false; // don't show progress bar if image<25MB switch (fi.fileType) {
n = validateNImages(fi); info = new FileInfo[n]; long size = fi.width*fi.height*fi.getBytesPerPixel(); for (int i=0; i<n; i++) { info[i] = (FileInfo)fi.clone();
n = validateNImages(fi); info = new FileInfo[n]; long size = fi.width*fi.height*fi.getBytesPerPixel(); for (int i=0; i<n; i++) { info[i] = (FileInfo)fi.clone();