view common-imagej/src/main/java/digilib/image/ImageJ1DocuImage.java @ 1128:fcafcc8996be

css validates now (no more directx filter). removed superfluous comma (js runs but ie6 still not really happy :-)
author robcast
date Fri, 09 Nov 2012 19:48:04 +0100
parents b2d97b842612
children
line wrap: on
line source

/**
 * 
 */
package digilib.image;

import ij.IJ;
import ij.ImagePlus;
import ij.plugin.JpegWriter;
import ij.plugin.PNG_Writer;
import ij.process.ImageProcessor;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Iterator;

import digilib.io.FileOpException;
import digilib.io.FileOps;
import digilib.io.ImageInput;
import digilib.util.ImageSize;

/** Implementation of DocuImage using ImageJ version 1.
 *  
 * @author casties
 *
 */
public class ImageJ1DocuImage extends ImageInfoDocuImage {

	protected ImagePlus img;
	protected ImageProcessor proc;

	/* returns a list of supported image formats */
	public Iterator<String> getSupportedFormats() {
		String[] formats = new String[] {"JPG","PNG","TIFF"};
		return Arrays.asList(formats).iterator();
	}

    /* Check image size and type and store in ImageInput */
    public ImageInput identify(ImageInput input) throws IOException {
        // try parent method first
        ImageInput ii = super.identify(input);
        if (ii != null) {
        	return ii;
        }
        logger.debug("identifying (ImageJ1) " + input);
        String path = input.getFile().getAbsolutePath();
        img = IJ.openImage(path);
        // set size
        ImageSize d = new ImageSize(img.getWidth(), img.getHeight());
        input.setSize(d);
        // set mime type
        if (input.getMimetype() == null) {
        	String t = FileOps.mimeForFile(input.getFile());
        	input.setMimetype(t);
        }
        return input;
    }

    /* (non-Javadoc)
	 * @see digilib.image.DocuImageImpl#loadImage(digilib.io.ImageInput)
	 */
	@Override
	public void loadImage(ImageInput ii) throws FileOpException {
		this.input = ii;
		String path = ii.getFile().getAbsolutePath();
		img = IJ.openImage(path);
		proc = img.getProcessor();
	}

	/* (non-Javadoc)
	 * @see digilib.image.DocuImageImpl#crop(int, int, int, int)
	 */
	@Override
	public void crop(int xoff, int yoff, int width, int height)
			throws ImageOpException {
		proc.setRoi(xoff, yoff, width, height);
		ImageProcessor croppedProc = proc.crop();
		proc = croppedProc;
	}

	/* (non-Javadoc)
	 * @see digilib.image.DocuImageImpl#scale(double, double)
	 */
	@Override
	public void scale(double scaleX, double scaleY) throws ImageOpException {
		int newWidth = (int) Math.round(proc.getWidth() * scaleX); 
		int newHeight = (int) Math.round(proc.getHeight() * scaleY);
		ImageProcessor scaledProc = proc.resize(newWidth, newHeight, false);
		proc = scaledProc;
	}

	/* (non-Javadoc)
	 * @see digilib.image.DocuImageImpl#writeImage(java.lang.String, java.io.OutputStream)
	 */
	@Override
	public void writeImage(String mt, OutputStream ostream)
			throws ImageOpException, FileOpException {
		File outFile;
		String filext = ".jpg"; 
		if (mt.equals("image/png")) {
			filext = ".png";
		}
		try {
			outFile = File.createTempFile("imgj_temp", filext);
		} catch (IOException e) {
			throw new FileOpException(e.toString());
		}
		// save image to file
		logger.debug("writeImage: mt="+mt);
		if (mt.equals("image/png")) {
			PNG_Writer writer = new PNG_Writer();
			try {
				img = new ImagePlus("Image", proc);
				writer.writeImage(img, outFile.getAbsolutePath(), 0);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			img = new ImagePlus("Image", proc);
			JpegWriter.save(img, outFile.getAbsolutePath(), 70);
		}
		// now send file
        FileInputStream inFile = null;
		try {
            inFile = new FileInputStream(outFile);
            byte dataBuffer[] = new byte[4096];
            int len;
            while ((len = inFile.read(dataBuffer)) != -1) {
                // copy out file
                ostream.write(dataBuffer, 0, len);
            }
        } catch (IOException e) {
			throw new FileOpException(e.toString());
		} finally {
            try {
                if (inFile != null) {
                    inFile.close();
                }
            } catch (IOException e) {
                // nothing to do
            }
        }
	}

}