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 2021/09/28 17:09:28 UTC

svn commit: r1893712 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java

Author: tilman
Date: Tue Sep 28 17:09:27 2021
New Revision: 1893712

URL: http://svn.apache.org/viewvc?rev=1893712&view=rev
Log:
PDFBOX-4892: refactor

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java?rev=1893712&r1=1893711&r2=1893712&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java Tue Sep 28 17:09:27 2021
@@ -27,7 +27,6 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.IOException;
-import java.io.OutputStream;
 import java.util.Iterator;
 import javax.imageio.IIOImage;
 import javax.imageio.ImageIO;
@@ -334,23 +333,21 @@ public final class JPEGFactory
     private static PDImageXObject createJPEG(PDDocument document, BufferedImage image,
                                              float quality, int dpi) throws IOException
     {
-        // extract alpha channel (if any)
         BufferedImage awtColorImage = getColorImage(image);
-        BufferedImage awtAlphaImage = getAlphaImage(image);
 
         // create XObject
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        encodeImageToJPEGStream(awtColorImage, quality, dpi, baos);
-        ByteArrayInputStream byteStream = new ByteArrayInputStream(baos.toByteArray());
-        
-        PDImageXObject pdImage = new PDImageXObject(document, byteStream, 
-                COSName.DCT_DECODE, awtColorImage.getWidth(), awtColorImage.getHeight(), 
-                8,
+        byte[] encoded = encodeImageToJPEGStream(awtColorImage, quality, dpi);
+        ByteArrayInputStream encodedByteStream = new ByteArrayInputStream(encoded);
+
+        PDImageXObject pdImage = new PDImageXObject(document, encodedByteStream, COSName.DCT_DECODE,
+                awtColorImage.getWidth(), awtColorImage.getHeight(), 8,
                 getColorSpaceFromAWT(awtColorImage));
 
-        // alpha -> soft mask
+        // extract alpha channel (if any)
+        BufferedImage awtAlphaImage = getAlphaImage(image);
         if (awtAlphaImage != null)
         {
+            // alpha -> soft mask
             PDImage xAlpha = JPEGFactory.createFromImage(document, awtAlphaImage, quality);
             pdImage.getCOSObject().setItem(COSName.SMASK, xAlpha);
         }
@@ -379,14 +376,14 @@ public final class JPEGFactory
         throw new IOException("No ImageWriter found for JPEG format");
     }
 
-    private static void encodeImageToJPEGStream(BufferedImage image, float quality, int dpi,
-                                                OutputStream out) throws IOException
+    private static byte[] encodeImageToJPEGStream(BufferedImage image, float quality, int dpi) throws IOException
     {
         ImageWriter imageWriter = getJPEGImageWriter(); // find JAI writer
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ImageOutputStream ios = null;
         try
         {  
-            ios = ImageIO.createImageOutputStream(out);
+            ios = ImageIO.createImageOutputStream(baos);
             imageWriter.setOutput(ios);
 
             // add compression
@@ -396,21 +393,22 @@ public final class JPEGFactory
 
             // add metadata
             ImageTypeSpecifier imageTypeSpecifier = new ImageTypeSpecifier(image);
-            IIOMetadata data = imageWriter.getDefaultImageMetadata(imageTypeSpecifier, jpegParam);
-            Element tree = (Element)data.getAsTree("javax_imageio_jpeg_image_1.0");
-            Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
+            IIOMetadata metadata = imageWriter.getDefaultImageMetadata(imageTypeSpecifier, jpegParam);
+            Element tree = (Element) metadata.getAsTree("javax_imageio_jpeg_image_1.0");
+            Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
             String dpiString = Integer.toString(dpi);
             jfif.setAttribute("Xdensity", dpiString);
             jfif.setAttribute("Ydensity", dpiString);
             jfif.setAttribute("resUnits", "1"); // 1 = dots/inch
 
             // write
-            imageWriter.write(data, new IIOImage(image, null, null), jpegParam);
+            imageWriter.write(metadata, new IIOImage(image, null, null), jpegParam);
+
+            return baos.toByteArray();
         }
         finally
         {
             // clean up
-            IOUtils.closeQuietly(out);
             if (ios != null)
             {
                 ios.close();