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 2018/10/08 15:59:59 UTC

svn commit: r1843167 - /pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java

Author: tilman
Date: Mon Oct  8 15:59:59 2018
New Revision: 1843167

URL: http://svn.apache.org/viewvc?rev=1843167&view=rev
Log:
PDFBOX-4163: save ARGB images into jpeg only when supported; optimize writing

Modified:
    pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java

Modified: pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java?rev=1843167&r1=1843166&r2=1843167&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java Mon Oct  8 15:59:59 2018
@@ -16,12 +16,14 @@
 package org.apache.pdfbox.pdmodel.graphics.image;
 
 import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.HashSet;
 import java.util.Set;
 import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
+import javax.imageio.spi.ImageWriterSpi;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -61,13 +63,33 @@ public class ValidateXImage
         assertEquals(ximage.getWidth(), ximage.getImage().getWidth());
         assertEquals(ximage.getHeight(), ximage.getImage().getHeight());
 
-        boolean writeOk = ImageIO.write(ximage.getImage(),
-                format, new ByteArrayOutputStream());
-        assertTrue(writeOk);
-        writeOk = ImageIO.write(ximage.getOpaqueImage(),
-                format, new ByteArrayOutputStream());
+        boolean canEncode = true;
+        boolean writeOk;
+        // jdk11+ no longer encodes ARGB jpg
+        // https://bugs.openjdk.java.net/browse/JDK-8211748
+        if ("jpg".equals(format) &&
+            ximage.getImage().getType() == BufferedImage.TYPE_INT_ARGB)
+        {
+            ImageWriter writer = ImageIO.getImageWritersBySuffix(format).next();
+            ImageWriterSpi originatingProvider = writer.getOriginatingProvider();
+            canEncode = originatingProvider.canEncodeImage(ximage.getImage());
+        }
+        if (canEncode)
+        {
+            writeOk = ImageIO.write(ximage.getImage(), format, new NullOutputStream());
+            assertTrue(writeOk);
+        }
+        writeOk = ImageIO.write(ximage.getOpaqueImage(), format, new NullOutputStream());
         assertTrue(writeOk);
     }
+    
+    private static class NullOutputStream extends OutputStream
+    {
+        @Override
+        public void write(int b) throws IOException
+        {
+        }
+    }
 
     static int colorCount(BufferedImage bim)
     {