/*
* #%L
* OME Bio-Formats package for reading and converting biological file formats.
* %%
* Copyright (C) 2005 - 2015 Open Microscopy Environment:
* - Board of Regents of the University of Wisconsin-Madison
* - Glencoe Software, Inc.
* - University of Dundee
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
import loci.common.Location;
import loci.common.RandomAccessInputStream;
import loci.common.services.ServiceFactory;
import loci.formats.FilePattern;
import loci.formats.in.TiffReader;
import loci.formats.meta.IMetadata;
import loci.formats.out.TiffWriter;
import loci.formats.services.OMEXMLService;
import loci.formats.tiff.IFD;
import loci.formats.tiff.TiffParser;
/**
* Stitches the first plane from a collection of TIFFs into a single file.
*/
public class SewTiffs {
private static final int DOTS = 50;
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.out.println(
"Usage: java SewTiffs base_name channel_num [time_count]");
System.exit(1);
}
String base = args[0];
int c = Integer.parseInt(args[1]);
int num;
if (args.length < 3) {
FilePattern fp = new FilePattern(
new Location(base + "_C" + c + "_TP1.tiff"));
int[] count = fp.getCount();
num = count[count.length - 1];
}
else num = Integer.parseInt(args[2]);
System.out.println("Fixing " + base + "_C" + c + "_TP<1-" + num + ">.tiff");
TiffReader in = new TiffReader();
TiffWriter out = new TiffWriter();
String outId = base + "_C" + c + ".tiff";
System.out.println("Writing " + outId);
out.setId(outId);
System.out.print(" ");
boolean comment = false;
for (int t=0; t<num; t++) {
String inId = base + "_C" + c + "_TP" + (t + 1) + ".tiff";
ServiceFactory factory = new ServiceFactory();
OMEXMLService service = factory.getInstance(OMEXMLService.class);
IMetadata meta = service.createOMEXMLMetadata();
in.setMetadataStore(meta);
in.setId(inId);
out.setMetadataRetrieve(meta);
// read first image plane
byte[] image = in.openBytes(0);
in.close();
if (t == 0) {
// read first IFD
RandomAccessInputStream ras = new RandomAccessInputStream(inId);
TiffParser parser = new TiffParser(ras);
IFD ifd = parser.getFirstIFD();
ras.close();
// preserve TIFF comment
String desc = ifd.getComment();
if (desc != null) {
ifd = new IFD();
ifd.putIFDValue(IFD.IMAGE_DESCRIPTION, desc);
comment = true;
out.saveBytes(t, image, ifd);
System.out.print(".");
continue;
}
}
// write image plane
out.saveBytes(t, image);
// update status
System.out.print(".");
if (t % DOTS == DOTS - 1) {
System.out.println(" " + (t + 1));
System.out.print(" ");
}
}
System.out.println();
if (comment) System.out.println("OME-TIFF comment saved.");
else System.out.println("No OME-TIFF comment found.");
}
}