You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/02/20 20:20:26 UTC

svn commit: r1570317 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java

Author: jahewson
Date: Thu Feb 20 19:20:26 2014
New Revision: 1570317

URL: http://svn.apache.org/r1570317
Log:
Fixed issue with pink images in PDFBOX-1893

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java?rev=1570317&r1=1570316&r2=1570317&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java Thu Feb 20 19:20:26 2014
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.filter;
 
+import java.awt.image.BufferedImage;
 import java.awt.image.DataBufferByte;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
@@ -66,9 +67,9 @@ public final class DCTFilter implements 
                     "a suitable JAI I/O image filter is not installed");
         }
 
-        ImageInputStream iis = ImageIO.createImageInputStream(input);
-        reader.setInput(iis);
-        Raster raster = reader.readRaster(0, null);
+        // I'd planned to use ImageReader#readRaster but it is buggy
+        BufferedImage hack = ImageIO.read(input);
+        Raster raster = hack.getRaster();
 
         // special handling for 4-component images
         if (raster.getNumBands() == 4)
@@ -96,6 +97,11 @@ public final class DCTFilter implements 
                 case 2: raster = fromYCCKtoCMYK(raster); break;
             }
         }
+        else if (raster.getNumBands() == 3)
+        {
+            // BGR to RGB
+            raster = fromBGRtoRGB(raster);
+        }
 
         DataBufferByte dataBuffer = (DataBufferByte)raster.getDataBuffer();
         output.write(dataBuffer.getData());
@@ -127,7 +133,6 @@ public final class DCTFilter implements 
     private WritableRaster fromYCCKtoCMYK(Raster raster) throws IOException
     {
         WritableRaster writableRaster = raster.createCompatibleWritableRaster();
-        writableRaster.setRect(raster);
 
         int[] value = new int[4];
         for (int y = 0, height = raster.getHeight(); y < height; y++)
@@ -152,7 +157,7 @@ public final class DCTFilter implements 
                 int magenta = 255 - g;
                 int yellow = 255 - b;
 
-                // update raster in-place
+                // update new raster
                 value[0] = cyan;
                 value[1] = magenta;
                 value[2] = yellow;
@@ -163,6 +168,28 @@ public final class DCTFilter implements 
         return writableRaster;
     }
 
+    // converts from BGR to RGB
+    private WritableRaster fromBGRtoRGB(Raster raster) throws IOException
+    {
+        WritableRaster writableRaster = raster.createCompatibleWritableRaster();
+
+        int[] bgr = new int[3];
+        int[] rgb = new int[3];
+        for (int y = 0, height = raster.getHeight(); y < height; y++)
+        {
+            for (int x = 0, width = raster.getWidth(); x < width; x++)
+            {
+                raster.getPixel(x, y, bgr);
+                rgb[0] = bgr[2];
+                rgb[1] = bgr[1];
+                rgb[2] = bgr[0];
+                writableRaster.setPixel(x, y, rgb);
+            }
+        }
+
+        return writableRaster;
+    }
+
     // clamps value to 0-255 range
     private int clamp(float value)
     {