You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2014/05/10 00:12:08 UTC

svn commit: r1593630 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image: ImageFactory.java JPEGFactory.java

Author: tilman
Date: Fri May  9 22:12:07 2014
New Revision: 1593630

URL: http://svn.apache.org/r1593630
Log:
PDFBOX-2067: throw exception for BITMASK transparency; moved getAlphaImage() up one level; optimized getColorImage() with ColorConvertOp

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java?rev=1593630&r1=1593629&r2=1593630&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java Fri May  9 22:12:07 2014
@@ -24,7 +24,7 @@ import org.apache.pdfbox.pdmodel.graphic
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_ColorSpace;
 import java.awt.image.BufferedImage;
-import java.awt.image.WritableRaster;
+import java.awt.image.ColorConvertOp;
 
 /**
  * An image factory.
@@ -75,19 +75,6 @@ class ImageFactory
         }
     }
 
-    // returns the alpha channel of an image
-    protected static BufferedImage getAlphaImage(BufferedImage image)
-    {
-        if (!image.getColorModel().hasAlpha())
-        {
-            return null;
-        }
-        WritableRaster alphaRaster = image.getAlphaRaster();
-        BufferedImage alphaImage = new BufferedImage(alphaRaster.getWidth(), alphaRaster.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
-        alphaImage.setData(alphaRaster);
-        return alphaImage;
-    }
-
     // returns the color channels of an image
     protected static BufferedImage getColorImage(BufferedImage image)
     {
@@ -100,22 +87,16 @@ class ImageFactory
         {
             throw new UnsupportedOperationException("only RGB color spaces are implemented");
         }
-        int width = image.getWidth();
-        int height = image.getHeight();
 
         // create an RGB image without alpha
         //BEWARE: the previous solution in the history 
         // g.setComposite(AlphaComposite.Src) and g.drawImage()
         // didn't work properly for TYPE_4BYTE_ABGR.
         // alpha values of 0 result in a black dest pixel!!!
-        BufferedImage rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
-        for (int x = 0; x < width; ++x)
-        {
-            for (int y = 0; y < height; ++y)
-            {
-                rgbImage.setRGB(x, y, image.getRGB(x, y) & 0xFFFFFF);
-            }
-        }
-        return rgbImage;
+        BufferedImage rgbImage = new BufferedImage(
+                image.getWidth(),
+                image.getHeight(),
+                BufferedImage.TYPE_3BYTE_BGR);
+        return new ColorConvertOp(null).filter(image, rgbImage);
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java?rev=1593630&r1=1593629&r2=1593630&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java Fri May  9 22:12:07 2014
@@ -16,7 +16,9 @@
  */
 package org.apache.pdfbox.pdmodel.graphics.image;
 
+import java.awt.Transparency;
 import java.awt.image.BufferedImage;
+import java.awt.image.WritableRaster;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
@@ -30,7 +32,6 @@ import org.apache.pdfbox.pdmodel.PDDocum
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReader;
 import javax.imageio.stream.ImageInputStream;
-import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.util.ImageIOUtil;
 
 /**
@@ -160,6 +161,23 @@ public final class JPEGFactory extends I
         return createJPEG(document, image, quality, dpi);
     }
     
+    // returns the alpha channel of an image
+    private static BufferedImage getAlphaImage(BufferedImage image) throws IOException
+    {
+        if (!image.getColorModel().hasAlpha())
+        {
+            return null;
+        }
+        if (image.getTransparency() == Transparency.BITMASK)
+        {
+            throw new UnsupportedOperationException("BITMASK Transparency JPEG compression is not useful, use LosslessImageFactory instead");
+        }
+        WritableRaster alphaRaster = image.getAlphaRaster();
+        BufferedImage alphaImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
+        alphaImage.setData(alphaRaster);
+        return alphaImage;
+    }
+    
     // Creates an Image XObject from a Buffered Image using JAI Image I/O
     private static PDImageXObject createJPEG(PDDocument document, BufferedImage image,
                                              float quality, int dpi) throws IOException