You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2006/07/24 22:40:03 UTC

svn commit: r425178 - /xmlgraphics/fop/trunk/src/java-1.4/org/apache/fop/image/ImageIOImage.java

Author: jeremias
Date: Mon Jul 24 13:40:02 2006
New Revision: 425178

URL: http://svn.apache.org/viewvc?rev=425178&view=rev
Log:
Activating ImageIOImage for reading PNG images in the ImageFactory made some test cases fail. The reason is that the PNGReader cannot extract the image resolution and leaves the default of 72dpi.
Added code to inspect the image metadata for resolution info.
I added the same hack as is already used in PNGImage to force loading the whole image when the image dimensions are requested, i.e. getting the right image size is more important than efficient memory use for now.
The image package needs that redesign sooner or later....

Modified:
    xmlgraphics/fop/trunk/src/java-1.4/org/apache/fop/image/ImageIOImage.java

Modified: xmlgraphics/fop/trunk/src/java-1.4/org/apache/fop/image/ImageIOImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java-1.4/org/apache/fop/image/ImageIOImage.java?rev=425178&r1=425177&r2=425178&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java-1.4/org/apache/fop/image/ImageIOImage.java (original)
+++ xmlgraphics/fop/trunk/src/java-1.4/org/apache/fop/image/ImageIOImage.java Mon Jul 24 13:40:02 2006
@@ -23,11 +23,19 @@
 import java.awt.image.ColorModel;
 import java.awt.image.IndexColorModel;
 import java.awt.image.BufferedImage;
+import java.util.Iterator;
 
 // ImageIO
 import javax.imageio.ImageIO;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageInputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.fop.util.UnitConv;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
 
 /**
  * FopImage object using ImageIO.
@@ -42,6 +50,10 @@
      */
     public ImageIOImage(FopImage.ImageInfo info) {
         super(info);
+        if ("image/png".equals(info.mimeType)
+                || "image/tiff".equals(info.mimeType)) {
+            this.loaded = 0; //TODO The PNG and TIFF Readers cannot read the resolution, yet. 
+        }
     }
 
     /**
@@ -54,6 +66,15 @@
         return true;
     }
     
+    private Element getChild(Element el, String name) {
+        NodeList nodes = el.getElementsByTagName(name);
+        if (nodes.getLength() > 0) {
+            return (Element)nodes.item(0);
+        } else {
+            return null;
+        }
+    }
+    
     /** @see org.apache.fop.image.AbstractFopImage#loadBitmap() */
     protected boolean loadBitmap() {
         if (this.bitmaps != null) {
@@ -61,8 +82,39 @@
         }
         try {
             inputStream.reset();
-            BufferedImage imageData = ImageIO.read(inputStream);
-
+            ImageInputStream imgStream = ImageIO.createImageInputStream(inputStream);
+            Iterator iter = ImageIO.getImageReaders(imgStream);
+            if (!iter.hasNext()) {
+                log.error("No ImageReader found.");
+                return false;
+            }
+            ImageReader reader = (ImageReader)iter.next();
+            ImageReadParam param = reader.getDefaultReadParam();
+            reader.setInput(imgStream, true, false);
+            BufferedImage imageData = reader.read(0, param);
+            
+            //Read image resolution
+            IIOMetadata iiometa = reader.getImageMetadata(0);
+            if (iiometa != null && iiometa.isStandardMetadataFormatSupported()) {
+                Element metanode = (Element)iiometa.getAsTree("javax_imageio_1.0");
+                Element dim = getChild(metanode, "Dimension");
+                if (dim != null) {
+                    Element child;
+                    child = getChild(dim, "HorizontalPixelSize");
+                    if (child != null) {
+                        this.dpiHorizontal = UnitConv.IN2MM
+                                / Float.parseFloat(child.getAttribute("value"));
+                    }
+                    child = getChild(dim, "VerticalPixelSize");
+                    if (child != null) {
+                        this.dpiVertical = UnitConv.IN2MM
+                                / Float.parseFloat(child.getAttribute("value"));
+                    }
+                }
+            }
+            imgStream.close();
+            reader.dispose();
+            
             this.height = imageData.getHeight();
             this.width = imageData.getWidth();
 



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org