package edu.mbl.jif.imaging.util; import java.awt.*; import java.awt.color.ColorSpace; import java.awt.event.*; import java.awt.image.*; import java.util.Hashtable; import javax.media.jai.RasterFactory; import javax.swing.*; import com.sun.media.jai.codec.ImageCodec; public class ImageFactoryGrayScale { // create from short[] public static BufferedImage createImage(int imageWidth, int imageHeight, int imageDepth, short[] data) { ComponentColorModel ccm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[]{imageDepth}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); ComponentSampleModel csm = new ComponentSampleModel(DataBuffer.TYPE_USHORT, imageWidth, imageHeight, 1, imageWidth, new int[]{0}); DataBuffer dataBuf = new DataBufferUShort((short[]) data, imageWidth); WritableRaster wr = Raster.createWritableRaster(csm, dataBuf, new Point(0, 0)); Hashtable ht = new Hashtable(); ht.put("owner", "edu.mbl.jif"); return new BufferedImage(ccm, wr, true, ht); } // create from byte[] public static BufferedImage createImage(int imageWidth, int imageHeight, int imageDepth, byte[] data) { ComponentColorModel ccm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[]{imageDepth}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); ComponentSampleModel csm = new ComponentSampleModel(DataBuffer.TYPE_BYTE, imageWidth, imageHeight, 1, imageWidth, new int[]{0}); DataBuffer dataBuf = new DataBufferByte((byte[]) data, imageWidth); WritableRaster wr = Raster.createWritableRaster(csm, dataBuf, new Point(0, 0)); Hashtable ht = new Hashtable(); ht.put("owner", "PSj"); return new BufferedImage(ccm, wr, true, ht); } //--------------------------------------------------------------------------- /* public static BufferedImage createImage ( int imageWidth, int imageHeight, int imageDepth, float[] data) { ComponentColorModel ccm = new ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] {imageDepth}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_FLOAT); ComponentSampleModel csm = new ComponentSampleModel( DataBuffer.TYPE_FLOAT, imageWidth, imageHeight, 1, imageWidth, new int[] {0}); DataBuffer dataBuf = new DataBufferFloat((float[]) data, imageWidth); WritableRaster wr = Raster.createWritableRaster(csm, dataBuf, new Point(0, 0)); Hashtable ht = new Hashtable(); ht.put("owner", "PSj"); return new BufferedImage(ccm, wr, true, ht); } */ // create from float[] public static BufferedImage createImage(int imageWidth, int imageHeight, int imageDepth, float[] pixels) { int w = imageWidth; int h = imageHeight; int nbBands = 1; int[] rgbOffset = new int[nbBands]; SampleModel sampleModel = RasterFactory.createPixelInterleavedSampleModel(DataBuffer.TYPE_FLOAT, w, h, nbBands, nbBands * w, rgbOffset); ColorModel colorModel = ImageCodec.createComponentColorModel(sampleModel); DataBufferFloat dataBuffer = new DataBufferFloat(pixels, pixels.length); WritableRaster raster = RasterFactory.createWritableRaster(sampleModel, dataBuffer, new Point(0, 0)); return new BufferedImage(colorModel, raster, false, null); } //Test ------------------------------------------------------------------- public static BufferedImage testImageFloat() { int wid = 256; int ht = 256; float max = 1.0f; int len = wid * ht; double scale = max / (float) len; float[] data = new float[wid * ht]; for (int i = 0; i < len; i++) { data[i] = (float) ((float) i * scale); } BufferedImage bi = createImage(wid, ht, 32, data); return bi; } public static BufferedImage testImageByte() { return testImageByte(256, 256); } public static BufferedImage testImageByte(int wid, int ht) { float max = 256f; int len = wid * ht; byte[] data = new byte[len]; double scale = max / (float) len; for (int i = 0; i < len; i++) { data[i] = (byte) ((float) i * scale); } // for (int i = 0; i < ht; i++) { // for (int j = 0; j < wid; j++) { // data[(i * ht) + j] = (byte) (Math.sqrt(j + 1 * i + 1)); // } // } BufferedImage bi = createImage(wid, ht, 8, data); return bi; } public static BufferedImage testImageShort16() { int wid = 256; int ht = 256; short[] data = new short[wid * ht]; float max = 64000f; int len = wid * ht; double scale = max / (float) len; for (int i = 0; i < len; i++) { data[i] = (short) ((float) i * scale); } BufferedImage bi = createImage(wid, ht, 16, data); return bi; } public static BufferedImage testImageShort12() { int wid = 256; int ht = 256; short[] data = new short[wid * ht]; float max = 4095f; int len = wid * ht; double scale = max / (float) len; for (int i = 0; i < len; i++) { data[i] = (short) ((float) i * scale); } BufferedImage bi = createImage(wid, ht, 12, data); return bi; } public static void main(String[] args) { ImageFactoryGrayScale gs = new ImageFactoryGrayScale(); BufferedImage biByte = testImageByte(); displayImage(biByte, biByte.getWidth(), biByte.getHeight(), "Byte"); BufferedImage biFloat = testImageFloat(); displayImage(biFloat, biFloat.getWidth(), biFloat.getHeight(), "Float"); } public static void displayImage(BufferedImage img, int wid, int ht, String title) { JFrame fr = new JFrame(); fr.setTitle(title); fr.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); ImagePanel pan = new ImagePanel(img); pan.setPreferredSize(new Dimension(wid, ht)); fr.getContentPane().add(pan); fr.pack(); //fr.setSize(wid, ht); fr.setVisible(true); } // For testing... static class ImagePanel extends JComponent { protected BufferedImage image; public ImagePanel() { } public ImagePanel(BufferedImage img) { image = img; } public void setImage(BufferedImage img) { image = img; } public void paint(Graphics g) { Rectangle rect = this.getBounds(); if (image != null) { g.drawImage(image, 0, 0, rect.width, rect.height, null); } } } }