Package gov.lanl.adore.djatoka.io.reader

Source Code of gov.lanl.adore.djatoka.io.reader.ImageJReader

/*
* Copyright (c) 2008  Los Alamos National Security, LLC.
*
* Los Alamos National Laboratory
* Research Library
* Digital Library Research & Prototyping Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/

package gov.lanl.adore.djatoka.io.reader;

import gov.lanl.adore.djatoka.io.FormatIOException;
import gov.lanl.adore.djatoka.io.IReader;
import gov.lanl.adore.djatoka.util.IOUtils;

import ij.ImagePlus;
import ij.io.Opener;
import ij.process.ImageProcessor;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import java.io.File;
import java.io.InputStream;

import net.sf.ij.jaiio.JAIReader;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Use ImageJ API to read image InputStream or image file path.
*
* @author Ryan Chute
*/
public class ImageJReader implements IReader {

    private static final Logger LOGGER = LoggerFactory.getLogger(ImageJReader.class);

    /**
     * Returns a BufferedImage instance for provided InputStream
     *
     * @param input an InputStream consisting of an image bitstream
     * @return a BufferedImage instance for source image InputStream
     * @throws FormatIOException
     */
    public BufferedImage open(InputStream input) throws FormatIOException {
        Opener o = new Opener();
        BufferedImage bi = null;
        // Most of the time we're dealing with TIF so try direct
        ImagePlus imp = o.openTiff(input, "tif");

        // Otherwise, we'll just stay in ImageJ but just provide a file path
        if (imp == null) {
            if (LOGGER.isInfoEnabled()) {
                LOGGER.info("Creating temp image");
            }

            File path = IOUtils.createTempImage(input);
            bi = open(path.getAbsolutePath());

            if (!path.delete() && LOGGER.isWarnEnabled()) {
                LOGGER.warn("File not deleted: {}", path);
            }
        } else {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Opening TIFF file");
            }

            bi = open(imp);
        }

        return bi;
    }

    /**
     * Returns a BufferedImage instance for provided image file path
     *
     * @param input absolute file path for image file
     * @return a BufferedImage instance for source image file
     * @throws FormatIOException
     */
    public BufferedImage open(String input) throws FormatIOException {
        ImagePlus ip;

        try {
            ip = JAIReader.read(new File(input))[0];
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
            throw new FormatIOException(e.getMessage(), e);
        }

        return open(ip);
    }

    /**
     * Internal ImagePlus processing to populate BufferedIMage using Graphics objects
     *
     * @param imp an ImageJ ImagePlus object
     * @return a BufferedImage of type BufferedImage.TYPE_3BYTE_BGR
     * @throws FormatIOException
     */
    private BufferedImage open(ImagePlus imp) throws FormatIOException {
        if (imp == null) {
            LOGGER.error("Null ImagePlus Object.");
            throw new FormatIOException("Null ImagePlus Object.");
        }

        ImageProcessor ip = imp.getProcessor();
        int width = ip.getWidth();
        int height = ip.getHeight();
        Image img = ip.createImage();
        imp.flush();
        imp = null;
        ip = null;

        BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        Graphics g = bImg.getGraphics();
        g.drawImage(img, 0, 0, null);
        img.flush();
        img = null;
        g.dispose();
        g = null;

        return bImg;
    }
}
TOP

Related Classes of gov.lanl.adore.djatoka.io.reader.ImageJReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.