private Double getNumber(Properties props, String key) { String s = props.getProperty(key); if (s != null) { try { return Double.valueOf(s); } catch (NumberFormatException e) { } } return null; }
public Properties decodeDescriptionString(FileInfo fi) { if (fi.description == null || fi.description.length() < 7) return null; if (IJ.debugMode) IJ.log("Image Description: " + new String(fi.description).replace('\n', ' ')); if (!fi.description.startsWith("ImageJ")) return null; Properties props = new Properties(); InputStream is = new ByteArrayInputStream(fi.description.getBytes()); try { props.load(is); is.close(); } catch (IOException e) { return null; } fi.unit = props.getProperty("unit", ""); Double n = getNumber(props, "cf"); if (n != null) fi.calibrationFunction = n.intValue(); double c[] = new double[5]; int count = 0; for (int i = 0; i < 5; i++) { n = getNumber(props, "c" + i); if (n == null) break; c[i] = n.doubleValue(); count++; } if (count >= 2) { fi.coefficients = new double[count]; for (int i = 0; i < count; i++) fi.coefficients[i] = c[i]; } fi.valueUnit = props.getProperty("vunit"); n = getNumber(props, "images"); if (n != null && n.doubleValue() > 1.0) fi.nImages = (int) n.doubleValue(); if (fi.nImages > 1) { double spacing = getDouble(props, "spacing"); if (spacing != 0.0) { if (spacing < 0) spacing = -spacing; fi.pixelDepth = spacing; } } return props; }
private boolean getBoolean(Properties props, String key) { String s = props.getProperty(key); return s != null && s.equals("true") ? true : false; }
void setCalibration(ImagePlus imp) { if (fi.fileType == FileInfo.GRAY16_SIGNED) { if (IJ.debugMode) IJ.log("16-bit signed"); double[] coeff = new double[2]; coeff[0] = -32768.0; coeff[1] = 1.0; imp.getLocalCalibration().setFunction(Calibration.STRAIGHT_LINE, coeff, "gray value"); } Properties props = decodeDescriptionString(fi); Calibration cal = imp.getCalibration(); boolean calibrated = false; if (fi.pixelWidth > 0.0 && fi.unit != null) { cal.pixelWidth = fi.pixelWidth; cal.pixelHeight = fi.pixelHeight; cal.pixelDepth = fi.pixelDepth; cal.setUnit(fi.unit); calibrated = true; } if (fi.valueUnit != null) { int f = fi.calibrationFunction; if ((f >= Calibration.STRAIGHT_LINE && f <= Calibration.RODBARD2 && fi.coefficients != null) || f == Calibration.UNCALIBRATED_OD) { boolean zeroClip = props != null && props.getProperty("zeroclip", "false").equals("true"); cal.setFunction(f, fi.coefficients, fi.valueUnit, zeroClip); calibrated = true; } } if (calibrated) checkForCalibrationConflict(imp, cal); if (fi.frameInterval != 0.0) cal.frameInterval = fi.frameInterval; if (props == null) return; cal.xOrigin = getDouble(props, "xorigin"); cal.yOrigin = getDouble(props, "yorigin"); cal.zOrigin = getDouble(props, "zorigin"); cal.info = props.getProperty("info"); cal.fps = getDouble(props, "fps"); cal.loop = getBoolean(props, "loop"); cal.frameInterval = getDouble(props, "finterval"); cal.setTimeUnit(props.getProperty("tunit", "sec")); double displayMin = getDouble(props, "min"); double displayMax = getDouble(props, "max"); if (!(displayMin == 0.0 && displayMax == 0.0)) { int type = imp.getType(); ImageProcessor ip = imp.getProcessor(); if (type == ImagePlus.GRAY8 || type == ImagePlus.COLOR_256) ip.setMinAndMax(displayMin, displayMax); else if (type == ImagePlus.GRAY16 || type == ImagePlus.GRAY32) { if (ip.getMin() != displayMin || ip.getMax() != displayMax) ip.setMinAndMax(displayMin, displayMax); } } int stackSize = imp.getStackSize(); if (stackSize > 1) { int channels = (int) getDouble(props, "channels"); int slices = (int) getDouble(props, "slices"); int frames = (int) getDouble(props, "frames"); if (channels == 0) channels = 1; if (slices == 0) slices = 1; if (frames == 0) frames = 1; // IJ.log("setCalibration: "+channels+" "+slices+" "+frames); if (channels * slices * frames == stackSize) { imp.setDimensions(channels, slices, frames); if (getBoolean(props, "hyperstack")) imp.setOpenAsHyperStack(true); } } }