001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.ext.awt.image.codec.imageio;
020:
021: import java.awt.image.RenderedImage;
022: import java.io.IOException;
023: import java.io.OutputStream;
024: import java.util.Iterator;
025:
026: import javax.imageio.IIOImage;
027: import javax.imageio.ImageIO;
028: import javax.imageio.ImageTypeSpecifier;
029: import javax.imageio.ImageWriteParam;
030: import javax.imageio.event.IIOWriteWarningListener;
031: import javax.imageio.metadata.IIOInvalidTreeException;
032: import javax.imageio.metadata.IIOMetadata;
033: import javax.imageio.metadata.IIOMetadataNode;
034: import javax.imageio.stream.ImageOutputStream;
035:
036: import org.w3c.dom.Node;
037: import org.w3c.dom.NodeList;
038:
039: import org.apache.batik.ext.awt.image.spi.ImageWriter;
040: import org.apache.batik.ext.awt.image.spi.ImageWriterParams;
041:
042: /**
043: * ImageWriter implementation that uses Image I/O to write images.
044: *
045: * @version $Id: ImageIOImageWriter.java 502538 2007-02-02 08:52:56Z dvholten $
046: */
047: public class ImageIOImageWriter implements ImageWriter,
048: IIOWriteWarningListener {
049:
050: private String targetMIME;
051:
052: /**
053: * Main constructor.
054: * @param mime the MIME type of the image format
055: */
056: public ImageIOImageWriter(String mime) {
057: this .targetMIME = mime;
058: }
059:
060: /**
061: * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream)
062: */
063: public void writeImage(RenderedImage image, OutputStream out)
064: throws IOException {
065: writeImage(image, out, null);
066: }
067:
068: /**
069: * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream, ImageWriterParams)
070: */
071: public void writeImage(RenderedImage image, OutputStream out,
072: ImageWriterParams params) throws IOException {
073: Iterator iter;
074: iter = ImageIO.getImageWritersByMIMEType(getMIMEType());
075: javax.imageio.ImageWriter iiowriter = (javax.imageio.ImageWriter) iter
076: .next();
077: if (iiowriter != null) {
078: iiowriter.addIIOWriteWarningListener(this );
079:
080: ImageOutputStream imgout = ImageIO
081: .createImageOutputStream(out);
082:
083: ImageWriteParam iwParam = getDefaultWriteParam(iiowriter,
084: image, params);
085:
086: ImageTypeSpecifier type;
087: if (iwParam.getDestinationType() != null) {
088: type = iwParam.getDestinationType();
089: } else {
090: type = ImageTypeSpecifier
091: .createFromRenderedImage(image);
092: }
093:
094: //Handle metadata
095: IIOMetadata meta = iiowriter.getDefaultImageMetadata(type,
096: iwParam);
097: //meta might be null for some JAI codecs as they don't support metadata
098: if (params != null && meta != null) {
099: meta = updateMetadata(meta, params);
100: }
101:
102: //Write image
103: iiowriter.setOutput(imgout);
104: IIOImage iioimg = new IIOImage(image, null, meta);
105: iiowriter.write(null, iioimg, iwParam);
106: } else {
107: throw new UnsupportedOperationException(
108: "No ImageIO codec for writing " + getMIMEType()
109: + " is available!");
110: }
111:
112: }
113:
114: /**
115: * Returns the default write parameters for encoding the image.
116: * @param iiowriter The IIO ImageWriter that will be used
117: * @param image the image to be encoded
118: * @param params the parameters for this writer instance
119: * @return the IIO ImageWriteParam instance
120: */
121: protected ImageWriteParam getDefaultWriteParam(
122: javax.imageio.ImageWriter iiowriter, RenderedImage image,
123: ImageWriterParams params) {
124: ImageWriteParam param = iiowriter.getDefaultWriteParam();
125: System.err.println("Param: " + params);
126: if ((params != null) && (params.getCompressionMethod() != null)) {
127: param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
128: param.setCompressionType(params.getCompressionMethod());
129: }
130: return param;
131: }
132:
133: /**
134: * Updates the metadata information based on the parameters to this writer.
135: * @param meta the metadata
136: * @param params the parameters
137: * @return the updated metadata
138: */
139: protected IIOMetadata updateMetadata(IIOMetadata meta,
140: ImageWriterParams params) {
141: final String stdmeta = "javax_imageio_1.0";
142: if (meta.isStandardMetadataFormatSupported()) {
143: IIOMetadataNode root = (IIOMetadataNode) meta
144: .getAsTree(stdmeta);
145: IIOMetadataNode dim = getChildNode(root, "Dimension");
146: IIOMetadataNode child;
147: if (params.getResolution() != null) {
148: child = getChildNode(dim, "HorizontalPixelSize");
149: if (child == null) {
150: child = new IIOMetadataNode("HorizontalPixelSize");
151: dim.appendChild(child);
152: }
153: child.setAttribute("value", Double.toString(params
154: .getResolution().doubleValue() / 25.4));
155: child = getChildNode(dim, "VerticalPixelSize");
156: if (child == null) {
157: child = new IIOMetadataNode("VerticalPixelSize");
158: dim.appendChild(child);
159: }
160: child.setAttribute("value", Double.toString(params
161: .getResolution().doubleValue() / 25.4));
162: }
163: try {
164: meta.mergeTree(stdmeta, root);
165: } catch (IIOInvalidTreeException e) {
166: throw new RuntimeException(
167: "Cannot update image metadata: "
168: + e.getMessage());
169: }
170: }
171: return meta;
172: }
173:
174: /**
175: * Returns a specific metadata child node
176: * @param n the base node
177: * @param name the name of the child
178: * @return the requested child node
179: */
180: protected static IIOMetadataNode getChildNode(Node n, String name) {
181: NodeList nodes = n.getChildNodes();
182: for (int i = 0; i < nodes.getLength(); i++) {
183: Node child = nodes.item(i);
184: if (name.equals(child.getNodeName())) {
185: return (IIOMetadataNode) child;
186: }
187: }
188: return null;
189: }
190:
191: /**
192: * @see ImageWriter#getMIMEType()
193: */
194: public String getMIMEType() {
195: return this .targetMIME;
196: }
197:
198: /**
199: * @see javax.imageio.event.IIOWriteWarningListener#warningOccurred(javax.imageio.ImageWriter, int, java.lang.String)
200: */
201: public void warningOccurred(javax.imageio.ImageWriter source,
202: int imageIndex, String warning) {
203: System.err
204: .println("Problem while writing image using ImageI/O: "
205: + warning);
206: }
207: }
|