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 2007/12/14 17:07:32 UTC

svn commit: r604214 - /xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java

Author: jeremias
Date: Fri Dec 14 08:07:30 2007
New Revision: 604214

URL: http://svn.apache.org/viewvc?rev=604214&view=rev
Log:
Added work-around for decoding CMYK JPEGs with ImageIO (no guarantees for color fidelity but it's better than not being able to use CMYK images).

Modified:
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java?rev=604214&r1=604213&r2=604214&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java Fri Dec 14 08:07:30 2007
@@ -23,6 +23,8 @@
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.IndexColorModel;
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.Map;
@@ -82,7 +84,7 @@
     /** {@inheritDoc} */
     public Image loadImage(ImageInfo info, Map hints, ImageSessionContext session)
             throws ImageException, IOException {
-        BufferedImage imageData = null;
+        RenderedImage imageData = null;
         IIOException firstException = null;
 
         IIOMetadata iiometa = (IIOMetadata)info.getCustomObjects().get(
@@ -100,7 +102,11 @@
                 reader.setInput(imgStream, false, ignoreMetadata);
                 final int pageIndex = 0; //Always the first page at the moment
                 try {
-                    imageData = reader.read(pageIndex, param);
+                    if (ImageFlavor.BUFFERED_IMAGE.equals(this.targetFlavor)) {
+                        imageData = reader.read(pageIndex, param);
+                    } else {
+                        imageData = reader.readAsRenderedImage(pageIndex, param);
+                    }
                     if (iiometa == null) {
                         iiometa = reader.getImageMetadata(pageIndex);
                     }
@@ -112,6 +118,15 @@
                         log.debug("non-first error loading image: " + iioe.getMessage());
                     }
                 }
+                try {
+                    //Try fallback for CMYK images
+                    BufferedImage bi = getFallbackBufferedImage(reader, pageIndex, param);
+                    imageData = bi;
+                    firstException = null; //Clear exception after successful fallback attempt
+                    break;
+                } catch (IIOException iioe) {
+                    //ignore
+                }
                 imgStream.reset();
             }
         } finally {
@@ -160,10 +175,44 @@
         }
         
         if (ImageFlavor.BUFFERED_IMAGE.equals(this.targetFlavor)) {
-            return new ImageBuffered(info, imageData, transparentColor);
+            return new ImageBuffered(info, (BufferedImage)imageData, transparentColor);
         } else {
             return new ImageRendered(info, imageData, transparentColor);
         }
+    }
+
+    private BufferedImage getFallbackBufferedImage(ImageReader reader,
+            int pageIndex, ImageReadParam param) throws IOException {
+        //Work-around found at: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4799903
+        //There are some additional ideas there if someone wants to go further.
+        
+        // Try reading a Raster (no color conversion).
+        Raster raster = reader.readRaster(pageIndex, param);
+
+        // Arbitrarily select a BufferedImage type.
+        int imageType;
+        switch(raster.getNumBands()) {
+        case 1:
+            imageType = BufferedImage.TYPE_BYTE_GRAY;
+            break;
+        case 3:
+            imageType = BufferedImage.TYPE_3BYTE_BGR;
+            break;
+        case 4:
+            imageType = BufferedImage.TYPE_4BYTE_ABGR;
+            break;
+        default:
+            throw new UnsupportedOperationException();
+        }
+
+        // Create a BufferedImage.
+        BufferedImage bi = new BufferedImage(raster.getWidth(),
+                                  raster.getHeight(),
+                                  imageType);
+
+        // Set the image data.
+        bi.getRaster().setRect(raster);
+        return bi;
     }
 
 



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