Java Forums

Main Menu
Home
Today's Posts
FAQ
Search
Contact Us

Java Network
Linux Archive
Java Tips
Java Tips Blog

Sponsored Links





Welcome to the Java Forums.

You are currently viewing our boards as a guest which gives you limited access to view most discussions and access our other features. By joining our free community, you will:

  • have access to post topics
  • communicate privately with other members (PM)
  • not see advertisements between posts
  • have the possibility to earn one of our surprises if you are an active member
  • access many other special features that will be introduced later.

Registration is fast, simple and absolutely free so please, join our community today!

If you have any problems with the registration process or your account login, please contact us.

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 06-25-2008, 12:30 PM
Moderator
 
Join Date: Nov 2007
Posts: 1,657
Java Tip will become famous soon enoughJava Tip will become famous soon enough
How to read an image in Java
Code:
import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.WritableRaster; import java.io.IOException; import java.util.Iterator; import javax.imageio.IIOException; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.ImageTypeSpecifier; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataFormat; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.stream.ImageInputStream; import org.w3c.dom.Node; /** * ch5ImageReader.java -- this class provides the functionality to read an image * of format ch5. */ public class ch5ImageReader extends ImageReader { private ImageInputStream iis; private ch5ImageMetadata[] imagemd; private ch5StreamMetadata streammd; public ch5ImageReader(ImageReaderSpi originatingProvider) { super(originatingProvider); } /** * return the ch5StreamMetadata object instantiated in the setStreamMetadata * method */ public IIOMetadata getStreamMetadata() { return streammd; } /** * return the ch5ImageMetadata object instantiated in the setImageMetadata * method */ public IIOMetadata getImageMetadata(int imageIndex) { return imagemd[imageIndex]; } /** * this method sets the input for this ImageReader and also calls the * setStreamMetadata method so that the numberImages field is available */ public void setInput(Object object, boolean seekForwardOnly) { super.setInput(object, seekForwardOnly); if (object == null) throw new IllegalArgumentException("input is null"); if (!(object instanceof ImageInputStream)) { String argString = "input not an ImageInputStream"; throw new IllegalArgumentException(argString); } iis = (ImageInputStream) object; setStreamMetadata(iis); } /** * this method provides suggestions for possible image types that will be * used to decode the image specified by index imageIndex. By default, the * first image type returned by this method will be the image type of the * BufferedImage returned by the ImageReader's getDestination method. In * this case, we are suggesting using an 8 bit grayscale image with no alpha * component. */ public Iterator getImageTypes(int imageIndex) { java.util.List l = new java.util.ArrayList(); ; int bits = 8; /* * can convert ch5 format into 8 bit grayscale image with no alpha */ l.add(ImageTypeSpecifier.createGrayscale(bits, DataBuffer.TYPE_BYTE, false)); return l.iterator(); } /** * read in the input image specified by index imageIndex using the * parameters specified by the ImageReadParam object param */ public BufferedImage read(int imageIndex, ImageReadParam param) { checkIndex(imageIndex); if (isSeekForwardOnly()) minIndex = imageIndex; else minIndex = 0; BufferedImage bimage = null; WritableRaster raster = null; /* * this method sets the image metadata so that we can use the getWidth * and getHeight methods */ setImageMetadata(iis, imageIndex); int srcWidth = getWidth(imageIndex); int srcHeight = getHeight(imageIndex); // initialize values to -1 int dstWidth = -1; int dstHeight = -1; int srcRegionWidth = -1; int srcRegionHeight = -1; int srcRegionXOffset = -1; int srcRegionYOffset = -1; int xSubsamplingFactor = -1; int ySubsamplingFactor = -1; if (param == null) param = getDefaultReadParam(); Iterator imageTypes = getImageTypes(imageIndex); try { /* * get the destination BufferedImage which will be filled using the * input image's pixel data */ bimage = getDestination(param, imageTypes, srcWidth, srcHeight); /* * get Rectangle object which will be used to clip the source * image's dimensions. */ Rectangle srcRegion = param.getSourceRegion(); if (srcRegion != null) { srcRegionWidth = (int) srcRegion.getWidth(); srcRegionHeight = (int) srcRegion.getHeight(); srcRegionXOffset = (int) srcRegion.getX(); srcRegionYOffset = (int) srcRegion.getY(); /* * correct for overextended source regions */ if (srcRegionXOffset + srcRegionWidth > srcWidth) dstWidth = srcWidth - srcRegionXOffset; else dstWidth = srcRegionWidth; if (srcRegionYOffset + srcRegionHeight > srcHeight) dstHeight = srcHeight - srcRegionYOffset; else dstHeight = srcRegionHeight; } else { dstWidth = srcWidth; dstHeight = srcHeight; srcRegionXOffset = srcRegionYOffset = 0; } /* * get subsampling factors */ xSubsamplingFactor = param.getSourceXSubsampling(); ySubsamplingFactor = param.getSourceYSubsampling(); /** * dstWidth and dstHeight should be equal to bimage.getWidth() and * bimage.getHeight() after these next two instructions */ dstWidth = (dstWidth - 1) / xSubsamplingFactor + 1; dstHeight = (dstHeight - 1) / ySubsamplingFactor + 1; } catch (IIOException e) { System.err.println("Can't create destination BufferedImage"); } raster = bimage.getWritableTile(0, 0); /* * using the parameters specified by the ImageReadParam object, read the * image image data into the destination BufferedImage */ byte[] srcBuffer = new byte[srcWidth]; byte[] dstBuffer = new byte[dstWidth]; int jj; int index; try { for (int j = 0; j < srcHeight; j++) { iis.readFully(srcBuffer, 0, srcWidth); jj = j - srcRegionYOffset; if (jj % ySubsamplingFactor == 0) { jj /= ySubsamplingFactor; if ((jj >= 0) && (jj < dstHeight)) { for (int i = 0; i < dstWidth; i++) { index = srcRegionXOffset + i * xSubsamplingFactor; dstBuffer[i] = srcBuffer[index]; } raster.setDataElements(0, jj, dstWidth, 1, dstBuffer); } } } } catch (IOException e) { bimage = null; } return bimage; } /** * this method sets the image metadata for the image indexed by index * imageIndex. This method is specific for the ch5 format and thus only sets * the image width and image height */ private void setImageMetadata(ImageInputStream iis, int imageIndex) { imagemd[imageIndex] = new ch5ImageMetadata(); try { String s; s = iis.readLine(); while (s.length() == 0) s = iis.readLine(); imagemd[imageIndex].imageWidth = Integer.parseInt(s.trim()); s = iis.readLine(); imagemd[imageIndex].imageHeight = Integer.parseInt(s.trim()); } catch (IOException exception) { } } /** * this method sets the stream metadata for the images represented by the * ImageInputStream iis. This method is specific for the ch5 format and thus * only sets the numberImages field. */ private void setStreamMetadata(ImageInputStream iis) { streammd = new ch5StreamMetadata(); try { String magicNumber = iis.readLine(); int numImages = Integer.parseInt(iis.readLine().trim()); streammd.numberImages = numImages; imagemd = new ch5ImageMetadata[streammd.numberImages]; } catch (IOException exception) { } } /** * This method can only be used after the stream metadata has been set * (which occurs in the setInput method). Else it will return a -1 */ public int getNumImages(boolean allowSearch) { return streammd.numberImages; } /** * This method can only be used after the stream metadata has been set * (which occurs in the setInput method). Else it will return a -1 */ public int getHeight(int imageIndex) { if (imagemd == null) return -1; checkIndex(imageIndex); return imagemd[imageIndex].imageHeight; } /** * This method can only be used after the stream metadata has been set * (which occurs in the setInput method). Else it will return a -1 */ public int getWidth(int imageIndex) { if (imagemd == null) return -1; checkIndex(imageIndex); return imagemd[imageIndex].imageWidth; } private void checkIndex(int imageIndex) { if (imageIndex >= streammd.numberImages) { String argString = "imageIndex >= number of images"; throw new IndexOutOfBoundsException(argString); } if (imageIndex < minIndex) { String argString = "imageIndex < minIndex"; throw new IndexOutOfBoundsException(argString); } } } /** * ch5StreamMetadata.java -- holds stream metadata for the ch5 format. The * internal tree for holding this metadata is read only */ class ch5StreamMetadata extends IIOMetadata { static final String nativeMetadataFormatName = "ch5.imageio.ch5stream_1.00"; static final String nativeMetadataFormatClassName = "ch5.imageio.ch5stream"; static final String[] extraMetadataFormatNames = null; static final String[] extraMetadataFormatClassNames = null; static final boolean standardMetadataFormatSupported = false; public int numberImages; public ch5StreamMetadata() { super(standardMetadataFormatSupported, nativeMetadataFormatName, nativeMetadataFormatClassName, extraMetadataFormatNames, extraMetadataFormatClassNames); numberImages = -1; } public boolean isReadOnly() { return true; } /** * IIOMetadataFormat objects are meant to describe the structure of metadata * returned from the getAsTree method. In this case, no such description is * available */ public IIOMetadataFormat getMetadataFormat(String formatName) { if (formatName.equals(nativeMetadataFormatName)) { return null; } else { throw new IllegalArgumentException("Unrecognized format!"); } } /** * returns the stream metadata in a tree corresponding to the provided * formatName */ public Node getAsTree(String formatName) { if (formatName.equals(nativeMetadataFormatName)) { return getNativeTree(); } else { throw new IllegalArgumentException("Unrecognized format!"); } } /** * returns the stream metadata in a tree using the following format * <!ELEMENT ch5.imageio.ch5stream_1.00 (imageDimensions)> <!ATTLIST * imageDimensions numberImages CDATA #REQUIRED */ private Node getNativeTree() { IIOMetadataNode node; // scratch node IIOMetadataNode root = new IIOMetadataNode(nativeMetadataFormatName); // Image descriptor node = new IIOMetadataNode("imageDimensions"); node.setAttribute("numberImages", Integer.toString(numberImages)); root.appendChild(node); return root; } public void setFromTree(String formatName, Node root) { throw new IllegalStateException("Metadata is read-only!"); } public void mergeTree(String formatName, Node root) { throw new IllegalStateException("Metadata is read-only!"); } public void reset() { throw new IllegalStateException("Metadata is read-only!"); } /** * initialize the stream metadata element numberImages */ public void initialize(int numberImages) { this.numberImages = numberImages; } } /** * ch5ImageMetadata.java -- holds image metadata for the ch5 format. The * internal tree for holding this metadata is read only */ class ch5ImageMetadata extends IIOMetadata { static final String nativeMetadataFormatName = "ch5.imageio.ch5image_1.00"; static final String nativeMetadataFormatClassName = "ch5.imageio.ch5image"; static final String[] extraMetadataFormatNames = null; static final String[] extraMetadataFormatClassNames = null; static final boolean standardMetadataFormatSupported = false; public int imageWidth; public int imageHeight; public ch5ImageMetadata() { super(standardMetadataFormatSupported, nativeMetadataFormatName, nativeMetadataFormatClassName, extraMetadataFormatNames, extraMetadataFormatClassNames); imageWidth = -1; imageHeight = -1; } public boolean isReadOnly() { return true; } /** * IIOMetadataFormat objects are meant to describe the structure of metadata * returned from the getAsTree method. In this case, no such description is * available */ public IIOMetadataFormat getMetadataFormat(String formatName) { if (formatName.equals(nativeMetadataFormatName)) { return null; } else { throw new IllegalArgumentException("Unrecognized format!"); } } /** * returns the image metadata in a tree corresponding to the provided * formatName */ public Node getAsTree(String formatName) { if (formatName.equals(nativeMetadataFormatName)) { return getNativeTree(); } else { throw new IllegalArgumentException("Unrecognized format!"); } } /** * returns the image metadata in a tree using the following format <!ELEMENT * ch5.imageio.ch5image_1.00 (imageDimensions)> <!ATTLIST imageDimensions * imageWidth CDATA #REQUIRED imageHeight CDATA #REQUIRED */ private Node getNativeTree() { IIOMetadataNode root = new IIOMetadataNode(nativeMetadataFormatName); IIOMetadataNode node = new IIOMetadataNode("imageDimensions"); node.setAttribute("imageWidth", Integer.toString(imageWidth)); node.setAttribute("imageHeight", Integer.toString(imageHeight)); root.appendChild(node); return root; } public void setFromTree(String formatName, Node root) { throw new IllegalStateException("Metadata is read-only!"); } public void mergeTree(String formatName, Node root) { throw new IllegalStateException("Metadata is read-only!"); } public void reset() { throw new IllegalStateException("Metadata is read-only!"); } /** * initialize the image metadata elements width and height */ public void initialize(int width, int height) { imageWidth = width; imageHeight = height; } }
__________________
Want to make your IDE the best?
To view links or images in signatures your post count must be 10 or greater. You currently have 0 posts.


To view links or images in signatures your post count must be 10 or greater. You currently have 0 posts.
to our beloved Java Forums! (closes on July 27, 2008)
Bookmark Post in Technorati
Reply With Quote
Sponsored Links
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Read character from Image area sundarjothi Advanced Java 1 05-22-2008 05:46 PM
Converting multiple banded image into single banded image... Image enhancement archanajathan Advanced Java 0 01-08-2008 07:29 PM
How to read a Web Page through java program JavaBean Java Tips 0 10-04-2007 11:31 PM
help to read .pst file through java umadas Advanced Java 0 07-30-2007 04:36 PM
Simplest way to read and display a jpeg image Hasan New To Java 1 05-31-2007 05:42 PM


All times are GMT +3. The time now is 10:42 AM.


VBulletin, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright ©2006 - 2007, www.java-forums.org