ch5ImageMetadata

This is the class used to hold the image metadata (see Listing 5.9). For reading, its values are taken from the input stream. For writing, its values must be set by the application. The DTD for this class is the following:

<!ELEMENT ch5.imageio.ch5image_1.0 (imageDimensions)>
<!ATTLIST imageDimensions
    imageWidth   CDATA  #REQUIRED
    imageHeight  CDATA  #REQUIRED
>

As was true for the ch5StreamMetadata class, this is a very minimal set of metadata used for illustrative purposes, and in practice these classes will be much more complicated.

Listing 5.9 ch5ImageMetadata.java
package ch5.imageio.plugins;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.metadata.IIOMetadataFormat;
import org.w3c.dom.Node;

/**
* ch5ImageMetadata.java -- holds image metadata for the ch5 format.
* The internal tree for holding this metadata is read only
*/
public class ch5ImageMetadata extends IIOMetadata {
   static final String
       nativeMetadataFormatName = "ch5.imageio.ch5image_1.0";

   static final String[] metadataFormatNames = {
       nativeMetadataFormatName
   };

   public int imageWidth;
   public int imageHeight;

   public ch5ImageMetadata() {
       super(nativeMetadataFormatName, metadataFormatNames);
       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("Not a recognized 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("Not a recognized format!");
       }
   }

   /**
    * returns the image metadata in a tree using the following format
    * <!ELEMENT ch5.imageio.ch5image_1.0 (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;
   }
}

ch5ImageReaderSpi

Listing 5.10 is identical to Listing 5.3, except that the metadata formats have now been defined so non-null values are provided for the metadata-related objects.

Listing 5.10 ch5ImageReaderSpi.java
package ch5.imageio.plugins;

import java.io.*;
import java.util.*;
import javax.imageio.ImageReader;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;

/**
 *  Simple, functional ImageReaderSpi used to understand how
 *  information regarding format name, suffices and mime types
 *  get passed to ImageIO static methods
 */
public class ch5ImageReaderSpi extends ImageReaderSpi {

    static final String[] suffixes = {"ch5", "CH5"};
    static final String[] names = {"ch5"};
    static final String[] MIMETypes = {"image/ch5"};

    static final String version = "1.00";
    static final String readerCN = "ch5.imageio.plugins.ch5ImageReader";
    static final String vendorName = "CompanyName";

    //writerSpiNames
    static final String[] wSN={"ch5.imageio.plugins.ch5ImageWriterSpi"};

    //StreamMetadataFormatNames and StreamMetadataFormatClassNames
    static final boolean supportedStandardStreamMetadataFormat = false;
    static final String nativeStreamMFN = "ch5.imageio.ch5stream_1.00";
    static final String nativeStreamMFCN = "ch5.imageio.ch5stream";
    static final String[] extraStreamMFN = null;
    static final String[] extraStreamMFCN = null;

    //ImageMetadataFormatNames and ImageMetadataFormatClassNames
    static final boolean supportedStandardImageMetadataFormat = false;
    static final String nativeImageMFN = "ch5.imageio.ch5image1.00";
    static final String nativeImageMFCN = "ch5.imageio.ch5image";
    static final String[] extraImageMFN = null;
    static final String[] extraImageMFCN = null;

    public ch5ImageReaderSpi() {
    super(vendorName,
          version,
          names,
          suffixes,
          MIMETypes,
          readerCN, //readerClassName
          STANDARD_INPUT_TYPE,
          wSN, //writerSpiNames
              false,
              nativeStreamMFN,
              nativeStreamMFCN,
              extraStreamMFN,
              extraStreamMFCN,
              false,
              nativeImageMFN,
              nativeImageMFCN,
              extraImageMFN,
              extraImageMFCN);
    }

    public String getDescription(Locale locale) {
    return "Demo ch5 image reader, version " + version;
    }

    public ImageReader createReaderInstance(Object extension) {
    return new ch5ImageReader(this);
    }

    /**
     * This method gets called when an application wants to see if
     * the input image's format can be decoded by this ImageReader.
     * In this case, we'll simply check the first byte of data to
     * see if its a 5 which is the format type's magic number
     */
    public boolean canDecodeInput(Object input) {
    boolean reply = false;

    ImageInputStream iis = (ImageInputStream)input;
    iis.mark(); // mark where we are in ImageInputStream
    try {
        String magicNumber = iis.readLine().trim();
        iis.reset(); // reset stream back to marked location
        if (magicNumber.equals("5"))
        reply = true;
    }
    catch (IOException exception) {
    }
    return reply;
    }
}

ch5ImageWriterSpi

Listing 5.11 is identical to Listing 5.4, except that the metadata formats have now been defined so non-null values are provided for the metadata-related objects.

Listing 5.11 ch5ImageWriterSpi.java
package ch5.imageio.plugins;

import java.io.*;
import java.util.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageWriter;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.stream.ImageInputStream;

/**
 *  Simple, functional ImageWriterSpi used to understand how
 *  information regarding format name, suffices and mime types
 *  get passed to ImageIO static methods
 */
public class ch5ImageWriterSpi extends ImageWriterSpi {

    static final String[] suffixes = {"ch5", "CH5"};
    static final String[] names = {"ch5"};
    static final String[] MIMETypes = {"image/ch5" };

    static final String version = "1.00";
    static final String writerClassName = "ch5.imageio.plugins.ch5ImageWriter";
    static final String vendorName = "Company Name";
    static final String[] readerSpiNames = {"ch5.imagio.plugins.ch5ImageReaderSpi"};
    /*
    static final String nativeStreamMetadataFormatName = "ch5.imageio.ch5stream_1.0";
    static final String[] streamMetadataFormatNames = {nativeStreamMetadataFormatName};
    static final String nativeImageMetadataFormatName = "ch5.imageio.ch5image_1.0";
    static final String[] imageMetadataFormatNames = {nativeImageMetadataFormatName};
    */

    static final String nativeStreamMetadataFormatName = "ch5.imageio.ch5stream_1.00";
    static final String nativeStreamMetadataFormatClassName = "ch5.imageio.ch5stream";
    static final String[] extraStreamMetadataFormatNames = {null};
    static final String[] extraStreamMetadataFormatClassNames = {null};

    static final String nativeImageMetadataFormatName = "ch5.imageio.ch5image_1.00";
    static final String nativeImageMetadataFormatClassName = "ch5.imageio.ch5image";
    static final String[] extraImageMetadataFormatNames = {null};
    static final String[] extraImageMetadataFormatClassNames = {null};

    public ch5ImageWriterSpi() {
    super(vendorName,
          version,
          names,
          suffixes,
          MIMETypes,
          writerClassName,
          STANDARD_OUTPUT_TYPE,
          readerSpiNames,
              false,
              nativeStreamMetadataFormatName,
              nativeStreamMetadataFormatClassName,
              extraStreamMetadataFormatNames,
              extraStreamMetadataFormatClassNames,
              false,
              nativeImageMetadataFormatName,
              nativeImageMetadataFormatClassName,
              extraImageMetadataFormatNames,
              extraImageMetadataFormatClassNames);

    }

    public String getDescription(Locale locale) {
    return "Demo ch5 image writer, version " + version;
    }


    public ImageWriter createWriterInstance(Object extension) {
    return new ch5ImageWriter(this);
    }

    /**
     * This method gets called when an application wants to see if
     * the corresponding ImageWriter can encode an image with
     * a ColorModel and SampleModel specified by the ImageTypeSpecifier
     */
    public boolean canEncodeImage(ImageTypeSpecifier its) {
    if (its.getBufferedImageType() == BufferedImage.TYPE_BYTE_GRAY)
        return true;
    else
        return false;
    }
}

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset