You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2011/01/30 18:05:52 UTC

svn commit: r1065318 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java

Author: lehmi
Date: Sun Jan 30 17:05:52 2011
New Revision: 1065318

URL: http://svn.apache.org/viewvc?rev=1065318&view=rev
Log:
PDFBOX-942: added the possibility to adjust the compression quality level when embedding a jpeg as proposed by Olivier Doremieux

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java?rev=1065318&r1=1065317&r2=1065318&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java Sun Jan 30 17:05:52 2011
@@ -28,10 +28,17 @@ import java.io.ByteArrayInputStream;
 import java.io.FileOutputStream;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 
+import javax.imageio.IIOImage;
 import javax.imageio.ImageIO;
 import javax.imageio.IIOException;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
+import javax.imageio.stream.ImageOutputStream;
 
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
@@ -53,6 +60,8 @@ public class PDJpeg extends PDXObjectIma
 
     private static final List<String> DCT_FILTERS = new ArrayList<String>();
 
+    private final static float defaultCompressionLevel = 0.75f;
+    
     static
     {
         DCT_FILTERS.add( COSName.DCT_DECODE.getName() );
@@ -97,6 +106,7 @@ public class PDJpeg extends PDXObjectIma
 
     /**
      * Construct from a buffered image.
+     * The default compression level of 0.75 will be used. 
      *
      * @param doc The document to create the image as part of.
      * @param bi The image to convert to a jpeg
@@ -104,7 +114,26 @@ public class PDJpeg extends PDXObjectIma
      */
     public PDJpeg( PDDocument doc, BufferedImage bi ) throws IOException
     {
+        super( new PDStream( doc ) , "jpg");
+        createImageStream(doc, bi, defaultCompressionLevel);
+    }
+    
+    /**
+     * Construct from a buffered image.
+     *
+     * @param doc The document to create the image as part of.
+     * @param bi The image to convert to a jpeg
+     * @param compressionQuality The quality level which is used to compress the image
+     * @throws IOException If there is an error processing the jpeg data.
+     */
+    public PDJpeg( PDDocument doc, BufferedImage bi, float compressionQuality ) throws IOException
+    {
         super( new PDStream( doc ), "jpg" );
+        createImageStream(doc, bi, compressionQuality);
+    }
+    
+    private void createImageStream(PDDocument doc, BufferedImage bi, float compressionQuality) throws IOException
+    {
         BufferedImage alpha = null;
         if (bi.getColorModel().hasAlpha())
         {
@@ -137,8 +166,25 @@ public class PDJpeg extends PDXObjectIma
         java.io.OutputStream os = getCOSStream().createFilteredStream();
         try
         {
-            ImageIO.write(bi,"jpeg",os);
-
+            ImageWriter writer = null;
+            Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
+            if (iter.hasNext()) 
+            {
+                writer = iter.next();
+            }
+            ImageOutputStream ios = ImageIO.createImageOutputStream(os);
+            writer.setOutput(ios);
+                
+            // Set the compression quality
+            JPEGImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());
+            iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+            iwparam.setCompressionQuality(compressionQuality);
+                
+            // Write the image
+            writer.write(null, new IIOImage(bi, null, null), iwparam);
+                
+            writer.dispose();
+            
             COSDictionary dic = getCOSStream();
             dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
             dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
@@ -146,7 +192,7 @@ public class PDJpeg extends PDXObjectIma
             PDXObjectImage alphaPdImage = null;
             if(alpha != null)
             {
-                alphaPdImage = new PDJpeg(doc, alpha);
+                alphaPdImage = new PDJpeg(doc, alpha, compressionQuality);
                 dic.setItem(COSName.SMASK, alphaPdImage);
             }
             setBitsPerComponent( 8 );