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/06 21:04:43 UTC

svn commit: r1592839 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/graphics/image/ test/java/org/apache/pdfbox/pdmodel/graphics/image/

Author: tilman
Date: Tue May  6 19:04:42 2014
New Revision: 1592839

URL: http://svn.apache.org/r1592839
Log:
PDFBOX-2057: fix masks for TYPE_4BYTE_ABGR, optimize, improve tests

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
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.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=1592839&r1=1592838&r2=1592839&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 Tue May  6 19:04:42 2014
@@ -112,16 +112,22 @@ 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
-        BufferedImage rgbImage = new BufferedImage(image.getWidth(), image.getHeight(),
-                BufferedImage.TYPE_INT_RGB);
-
-        Graphics2D g = rgbImage.createGraphics();
-        g.setComposite(AlphaComposite.Src);
-        g.drawImage(image, 0, 0, null);
-        g.dispose();
-
+        //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;
     }
 }

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=1592839&r1=1592838&r2=1592839&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 Tue May  6 19:04:42 2014
@@ -172,9 +172,9 @@ public final class JPEGFactory extends I
         BufferedImage awtAlphaImage = getAlphaImage(image);
 
         // create XObject
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ImageIOUtil.writeImage(image, "jpeg", bos, dpi, quality);
-        ByteArrayInputStream byteStream = new ByteArrayInputStream(bos.toByteArray());
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIOUtil.writeImage(image, "jpeg", baos, dpi, quality);
+        ByteArrayInputStream byteStream = new ByteArrayInputStream(baos.toByteArray());
         PDImageXObject pdImage = new PDImageXObject(document, byteStream);
         
         // add DCT filter
@@ -187,7 +187,7 @@ public final class JPEGFactory extends I
             PDImage xAlpha = JPEGFactory.createFromImage(document, awtAlphaImage, quality);
             dict.setItem(COSName.SMASK, xAlpha);
         }
-
+        
         // set properties (width, height, depth, color space, etc.)
         setPropertiesFromAWT(awtColorImage, pdImage);
 

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java Tue May  6 19:04:42 2014
@@ -30,7 +30,6 @@ import org.apache.pdfbox.pdmodel.PDDocum
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceColorSpace;
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
-import static org.apache.pdfbox.pdmodel.graphics.image.ImageFactory.getColorImage;
 
 /**
  * Factory for creating a PDImageXObject containing a lossless compressed image.
@@ -53,10 +52,9 @@ public class LosslessFactory
         int bpc;
         PDDeviceColorSpace deviceColorSpace;
 
-        // extract color channel
-        BufferedImage awtColorImage = getColorImage(image);
-
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        int height = image.getHeight();
+        int width = image.getWidth();
 
         if ((image.getType() == BufferedImage.TYPE_BYTE_GRAY
                 || image.getType() == BufferedImage.TYPE_BYTE_BINARY)
@@ -67,16 +65,17 @@ public class LosslessFactory
             // grayscale images need one color per sample
             bpc = image.getColorModel().getPixelSize();
             deviceColorSpace = PDDeviceGray.INSTANCE;
-            int h = awtColorImage.getHeight();
-            int w = awtColorImage.getWidth();
-            for (int y = 0; y < h; ++y)
+            for (int y = 0; y < height; ++y)
             {
-                for (int x = 0; x < w; ++x)
+                for (int x = 0; x < width; ++x)
                 {
-                    mcios.writeBits(awtColorImage.getRGB(x, y), bpc);
+                    mcios.writeBits(image.getRGB(x, y) & 0xFF, bpc);
                 }
             }
-            mcios.writeBits(0, 7); // padding
+            while (mcios.getBitOffset() != 0)
+            {
+                mcios.writeBit(0);
+            }
             mcios.flush();
             mcios.close();
         }
@@ -85,13 +84,11 @@ public class LosslessFactory
             // RGB
             bpc = 8;
             deviceColorSpace = PDDeviceRGB.INSTANCE;
-            int h = awtColorImage.getHeight();
-            int w = awtColorImage.getWidth();
-            for (int y = 0; y < h; ++y)
+            for (int y = 0; y < height; ++y)
             {
-                for (int x = 0; x < w; ++x)
+                for (int x = 0; x < width; ++x)
                 {
-                    Color color = new Color(awtColorImage.getRGB(x, y));
+                    Color color = new Color(image.getRGB(x, y));
                     bos.write(color.getRed());
                     bos.write(color.getGreen());
                     bos.write(color.getBlue());
@@ -113,8 +110,8 @@ public class LosslessFactory
 
         pdImage.setColorSpace(deviceColorSpace);
         pdImage.setBitsPerComponent(bpc);
-        pdImage.setHeight(awtColorImage.getHeight());
-        pdImage.setWidth(awtColorImage.getWidth());
+        pdImage.setHeight(image.getHeight());
+        pdImage.setWidth(image.getWidth());
 
         // alpha -> soft mask
         PDImage xAlpha = createAlphaFromARGBImage(document, image);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Tue May  6 19:04:42 2014
@@ -163,7 +163,7 @@ public final class PDImageXObject extend
         }
 
         // get image as RGB
-        BufferedImage image = SampledImageReader.getRGBImage(this,  getColorKeyMask());
+        BufferedImage image = SampledImageReader.getRGBImage(this, getColorKeyMask());
 
         // soft mask (overrides explicit mask)
         PDImageXObject softMask = getSoftMask();

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java Tue May  6 19:04:42 2014
@@ -22,6 +22,8 @@ import junit.framework.TestCase;
 import org.apache.pdfbox.io.RandomAccess;
 import org.apache.pdfbox.io.RandomAccessFile;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
 import static org.apache.pdfbox.pdmodel.graphics.image.ValidateXImage.validate;
 
 /**
@@ -41,7 +43,7 @@ public class CCITTFactoryTest extends Te
         PDDocument document = new PDDocument();
         RandomAccess reader = new RandomAccessFile(new File(tiffPath), "r");
         PDImageXObject ximage = CCITTFactory.createFromRandomAccess(document, reader);
-        validate(ximage, 1, 344, 287, "tiff");
+        validate(ximage, 1, 344, 287, "tiff", PDDeviceGray.INSTANCE.getName());
         document.close();
     }
 }

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java Tue May  6 19:04:42 2014
@@ -42,7 +42,7 @@ public class JPEGFactoryTest extends Tes
         PDDocument document = new PDDocument();
         InputStream stream = JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg");
         PDImageXObject ximage = JPEGFactory.createFromStream(document, stream);
-        validate(ximage, 8, 344, 287, "jpg");
+        validate(ximage, 8, 344, 287, "jpg", PDDeviceRGB.INSTANCE.getName());
         assertEquals(PDDeviceRGB.INSTANCE, ximage.getColorSpace());
         document.close();
     }
@@ -56,7 +56,7 @@ public class JPEGFactoryTest extends Tes
         PDDocument document = new PDDocument();
         InputStream stream = JPEGFactoryTest.class.getResourceAsStream("jpeg256.jpg");
         PDImageXObject ximage = JPEGFactory.createFromStream(document, stream);
-        validate(ximage, 8, 344, 287, "jpg");
+        validate(ximage, 8, 344, 287, "jpg", PDDeviceGray.INSTANCE.getName());
         assertEquals(PDDeviceGray.INSTANCE, ximage.getColorSpace());
         document.close();
     }
@@ -71,7 +71,7 @@ public class JPEGFactoryTest extends Tes
         BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg"));
         assertEquals(3, image.getColorModel().getNumComponents());
         PDImageXObject ximage = JPEGFactory.createFromImage(document, image);
-        validate(ximage, 8, 344, 287, "jpg");
+        validate(ximage, 8, 344, 287, "jpg", PDDeviceRGB.INSTANCE.getName());
         assertEquals(PDDeviceRGB.INSTANCE, ximage.getColorSpace());
         document.close();
     }
@@ -86,7 +86,7 @@ public class JPEGFactoryTest extends Tes
         BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("jpeg256.jpg"));
         assertEquals(1, image.getColorModel().getNumComponents());
         PDImageXObject ximage = JPEGFactory.createFromImage(document, image);
-        validate(ximage, 8, 344, 287, "jpg");
+        validate(ximage, 8, 344, 287, "jpg", PDDeviceGray.INSTANCE.getName());
         assertEquals(PDDeviceGray.INSTANCE, ximage.getColorSpace());
         document.close();
     }

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java Tue May  6 19:04:42 2014
@@ -17,10 +17,15 @@ package org.apache.pdfbox.pdmodel.graphi
 
 import java.awt.Graphics;
 import java.awt.image.BufferedImage;
+import java.io.File;
 import java.io.IOException;
 import javax.imageio.ImageIO;
 import junit.framework.TestCase;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
 import static org.apache.pdfbox.pdmodel.graphics.image.ValidateXImage.validate;
 
 /**
@@ -30,6 +35,15 @@ import static org.apache.pdfbox.pdmodel.
  */
 public class LosslessFactoryTest extends TestCase
 {
+    private final File testResultsDir = new File("target/test-output/graphics");
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        testResultsDir.mkdirs();
+    }
+
     /**
      * Tests RGB LosslessFactoryTest#createFromImage(PDDocument document,
      * BufferedImage image)
@@ -41,39 +55,52 @@ public class LosslessFactoryTest extends
         PDDocument document = new PDDocument();
         BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("png.png"));
 
-        PDImageXObject ximage = LosslessFactory.createFromImage(document, image);
-        validate(ximage, 8, 344, 287, "png");
-        checkIdent(image, ximage.getImage());
+        PDImageXObject ximage1 = LosslessFactory.createFromImage(document, image);
+        validate(ximage1, 8, 344, 287, "png", PDDeviceRGB.INSTANCE.getName());
+        checkIdent(image, ximage1.getImage());
 
         // Create a grayscale image
         BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
         Graphics g = grayImage.getGraphics();
         g.drawImage(image, 0, 0, null);
         g.dispose();
-        ximage = LosslessFactory.createFromImage(document, grayImage);
-        validate(ximage, 8, 344, 287, "png");
-        checkIdent(grayImage, ximage.getImage());
+        PDImageXObject ximage2 = LosslessFactory.createFromImage(document, grayImage);
+        validate(ximage2, 8, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+        checkIdent(grayImage, ximage2.getImage());
 
         // Create a bitonal image
         BufferedImage bitonalImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
         g = bitonalImage.getGraphics();
         g.drawImage(image, 0, 0, null);
         g.dispose();
-        ximage = LosslessFactory.createFromImage(document, bitonalImage);
-        validate(ximage, 1, 344, 287, "png");
-        checkIdent(bitonalImage, ximage.getImage());
-
+        PDImageXObject ximage3 = LosslessFactory.createFromImage(document, bitonalImage);
+        validate(ximage3, 1, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+        checkIdent(bitonalImage, ximage3.getImage());
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage1, 200, 300, ximage1.getWidth() / 2, ximage1.getHeight() / 2);
+        contentStream.drawXObject(ximage2, 200, 450, ximage2.getWidth() / 2, ximage2.getHeight() / 2);
+        contentStream.drawXObject(ximage3, 200, 600, ximage3.getWidth() / 2, ximage3.getHeight() / 2);
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "misc.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
         document.close();
-
     }
 
     /**
-     * Tests ARGB LosslessFactoryTest#createFromImage(PDDocument document,
+     * Tests INT_ARGB LosslessFactoryTest#createFromImage(PDDocument document,
      * BufferedImage image)
      *
      * @throws java.io.IOException
      */
-    public void testCreateLosslessFromImageARGB() throws IOException
+    public void testCreateLosslessFromImageINT_ARGB() throws IOException
     {
         PDDocument document = new PDDocument();
         BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("png.png"));
@@ -86,26 +113,91 @@ public class LosslessFactoryTest extends
         ag.drawImage(image, 0, 0, null);
         ag.dispose();
 
-        // create a weird transparency triangle
-        for (int y = 0; y < h; ++y)
+        for (int x = 0; x < argbImage.getWidth(); ++x)
         {
-            for (int x = 0; x < Math.min(y, w); ++x)
+            for (int y = 0; y < argbImage.getHeight(); ++y)
             {
-                argbImage.setRGB(x, y, image.getRGB(x, y) & 0xFFFFFF | ((x * 255 / w) << 24));
+                argbImage.setRGB(x, y, (argbImage.getRGB(x, y) & 0xFFFFFF) | ((y / 10 * 10) << 24));
             }
         }
 
         PDImageXObject ximage = LosslessFactory.createFromImage(document, argbImage);
-        validate(ximage, 8, 344, 287, "png");
+        validate(ximage, 8, 344, 287, "png", PDDeviceRGB.INSTANCE.getName());
+        checkIdent(argbImage, ximage.getImage());
+        checkIdentRGB(argbImage, SampledImageReader.getRGBImage(ximage, null));
+
+        assertNotNull(ximage.getSoftMask());
+        validate(ximage.getSoftMask(), 8, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "intargb.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+
+    /**
+     * Tests 4BYTE_ABGR LosslessFactoryTest#createFromImage(PDDocument document,
+     * BufferedImage image)
+     *
+     * @throws java.io.IOException
+     */
+    public void testCreateLosslessFromImage4BYTE_ABGR() throws IOException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("png.png"));
+
+        // create an ARGB image
+        int w = image.getWidth();
+        int h = image.getHeight();
+        BufferedImage argbImage = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
+        Graphics ag = argbImage.getGraphics();
+        ag.drawImage(image, 0, 0, null);
+        ag.dispose();
+
+        for (int x = 0; x < argbImage.getWidth(); ++x)
+        {
+            for (int y = 0; y < argbImage.getHeight(); ++y)
+            {
+                argbImage.setRGB(x, y, (argbImage.getRGB(x, y) & 0xFFFFFF) | ((y / 10 * 10) << 24));
+            }
+        }
+        
+        PDImageXObject ximage = LosslessFactory.createFromImage(document, argbImage);
+        validate(ximage, 8, 344, 287, "png", PDDeviceRGB.INSTANCE.getName());
+        checkIdent(argbImage, ximage.getImage());
+        checkIdentRGB(argbImage, SampledImageReader.getRGBImage(ximage, null));
 
         assertNotNull(ximage.getSoftMask());
-        validate(ximage.getSoftMask(), 8, 344, 287, "png");
+        validate(ximage.getSoftMask(), 8, 344, 287, "png", PDDeviceGray.INSTANCE.getName());
 
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "4bargb.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
         document.close();
     }
 
     /**
-     * Check whether images are identical.
+     * Check whether the images are identical.
      *
      * @param expectedImage
      * @param actualImage
@@ -116,17 +208,45 @@ public class LosslessFactoryTest extends
 
         int w = expectedImage.getWidth();
         int h = expectedImage.getHeight();
+        assertEquals(w, actualImage.getWidth());
+        assertEquals(h, actualImage.getHeight());
         for (int y = 0; y < h; ++y)
         {
             for (int x = 0; x < w; ++x)
             {
                 if (expectedImage.getRGB(x, y) != actualImage.getRGB(x, y))
                 {
-                    errMsg = String.format("(%d,%d) %X != %X", x, y, expectedImage.getRGB(x, y), actualImage.getRGB(x, y));
+                    errMsg = String.format("(%d,%d) %08X != %08X", x, y, expectedImage.getRGB(x, y), actualImage.getRGB(x, y));
                 }
                 assertEquals(errMsg, expectedImage.getRGB(x, y), actualImage.getRGB(x, y));
             }
         }
     }
+    /**
+     * Check whether the RGB part of images are identical.
+     *
+     * @param expectedImage
+     * @param actualImage
+     */
+    private void checkIdentRGB(BufferedImage expectedImage, BufferedImage actualImage)
+    {
+        String errMsg = "";
+
+        int w = expectedImage.getWidth();
+        int h = expectedImage.getHeight();
+        assertEquals(w, actualImage.getWidth());
+        assertEquals(h, actualImage.getHeight());
+        for (int y = 0; y < h; ++y)
+        {
+            for (int x = 0; x < w; ++x)
+            {
+                if ((expectedImage.getRGB(x, y) & 0xFFFFFF) != (actualImage.getRGB(x, y) & 0xFFFFFF))
+                {
+                    errMsg = String.format("(%d,%d) %06X != %06X", x, y, expectedImage.getRGB(x, y) & 0xFFFFFF, actualImage.getRGB(x, y) & 0xFFFFFF);
+                }
+                assertEquals(errMsg, expectedImage.getRGB(x, y) & 0xFFFFFF, actualImage.getRGB(x, y) & 0xFFFFFF);
+            }
+        }
+    }
 
 }

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java?rev=1592839&r1=1592838&r2=1592839&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java Tue May  6 19:04:42 2014
@@ -29,7 +29,7 @@ import org.apache.pdfbox.util.ImageIOUti
  */
 public class ValidateXImage
 {
-    static public void validate(PDImageXObject ximage, int bpc, int width, int height, String format) throws IOException
+    static public void validate(PDImageXObject ximage, int bpc, int width, int height, String format, String colorSpaceName) throws IOException
     {
         // check the dictionary
         assertNotNull(ximage);
@@ -39,13 +39,18 @@ public class ValidateXImage
         assertEquals(width, ximage.getWidth());
         assertEquals(height, ximage.getHeight());
         assertEquals(format, ximage.getSuffix());
+        assertEquals(colorSpaceName, ximage.getColorSpace().getName());
 
         // check the image
         assertNotNull(ximage.getImage());
         assertEquals(ximage.getWidth(), ximage.getImage().getWidth());
         assertEquals(ximage.getHeight(), ximage.getImage().getHeight());
 
-        boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(), format, new NullOutputStream());
+        boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(), 
+                format, new NullOutputStream());
+        assertTrue(writeOk);
+        writeOk = ImageIOUtil.writeImage(SampledImageReader.getRGBImage(ximage, null), 
+                format, new NullOutputStream());
         assertTrue(writeOk);
     }