
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import javax.imageio.metadata.IIOMetadata;

import javax.imageio.plugins.tiff.*;
import javax.imageio.stream.*;


public class LoadImage {

    private ImageReader getTIFFReader() {

        java.util.Iterator<ImageReader> readers =
            ImageIO.getImageReadersByFormatName("TIFF");
        if (!readers.hasNext()) {
            throw new RuntimeException("No readers available for TIFF format");
        }
        return readers.next();
    }

    private final String fileName;
    public LoadImage(String img) { fileName = img; }

    private void check(boolean ok, String msg) {
        if (!ok) { throw new RuntimeException(msg); }
    }

    private void load() throws IOException {

        ImageReader reader = getTIFFReader();

        ImageInputStream s = ImageIO.createImageInputStream(new File(fileName));
        reader.setInput(s);

        int ni = reader.getNumImages(true);
        check(ni == 1, "invalid number of images");

        IIOImage iioimg = reader.readAll(0, null);
        IIOMetadata metadata = iioimg.getMetadata();
        TIFFDirectory dir = TIFFDirectory.createFromMetadata(metadata);

        // check image
        BufferedImage img = (BufferedImage) iioimg.getRenderedImage();
        reader.dispose();
        s.close();

        int w = img.getWidth(), h = img.getHeight();
        check((w == 512) && (w == h), "invalid size");

        TIFFField fields[] = dir.getTIFFFields();
        for (TIFFField f: fields) {
            System.out.print(f.getTag().getName() + "(" + f.getTagNumber() + ")");
            if (f.isIntegral()) { System.out.print("  " + f.getAsInt(0)); }
            System.out.println("");
        }

    }

    public static void main(String[] args) throws IOException {

        (new LoadImage("lenaNOK.tiff")).load();
    }
}
