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/03/15 16:21:51 UTC

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

Author: tilman
Date: Sat Mar 15 15:21:50 2014
New Revision: 1577878

URL: http://svn.apache.org/r1577878
Log:
PDFBOX-1969: more refactoring; removed useless line; added graphics.dispose() call; prepare test for ARGB image

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/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.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=1577878&r1=1577877&r2=1577878&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 Sat Mar 15 15:21:50 2014
@@ -108,6 +108,7 @@ class ImageFactory
         Graphics2D g = rgbImage.createGraphics();
         g.setComposite(AlphaComposite.Src);
         g.drawImage(image, 0, 0, null);
+        g.dispose();
 
         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=1577878&r1=1577877&r2=1577878&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 Sat Mar 15 15:21:50 2014
@@ -21,7 +21,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 org.apache.pdfbox.cos.COSName;
@@ -29,18 +28,11 @@ import org.apache.pdfbox.filter.MissingI
 import org.apache.pdfbox.io.IOUtils;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.w3c.dom.Element;
-
-import javax.imageio.IIOImage;
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReader;
-import javax.imageio.ImageTypeSpecifier;
-import javax.imageio.ImageWriter;
-import javax.imageio.metadata.IIOMetadata;
-import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
 import javax.imageio.stream.ImageInputStream;
-import javax.imageio.stream.ImageOutputStream;
 import org.apache.pdfbox.cos.COSStream;
+import org.apache.pdfbox.util.ImageIOUtil;
 
 /**
  * Factory for creating a PDImageXObject containing a JPEG compressed image.
@@ -172,51 +164,6 @@ public final class JPEGFactory extends I
         return createJPEG(document, image, quality, dpi);
     }
     
-    private static void encodeImageToJPEGStream(BufferedImage image, float quality, int dpi, OutputStream out) 
-            throws IOException
-    {
-        // encode to JPEG
-        ImageOutputStream ios = null;
-        ImageWriter imageWriter = null;
-        try
-        {
-            // find JAI writer
-            imageWriter = ImageIO.getImageWritersBySuffix("jpeg").next();
-            ios = ImageIO.createImageOutputStream(out);
-            imageWriter.setOutput(ios);
-
-            // add compression
-            JPEGImageWriteParam jpegParam = (JPEGImageWriteParam)imageWriter.getDefaultWriteParam();
-            jpegParam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
-            jpegParam.setCompressionQuality(quality);
-
-            // 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);
-            jfif.setAttribute("Xdensity", Integer.toString(dpi));
-            jfif.setAttribute("Ydensity", Integer.toString(dpi));
-            jfif.setAttribute("resUnits", "1"); // 1 = dots/inch
-
-            // write
-            imageWriter.write(data, new IIOImage(image, null, null), jpegParam);
-        }
-        finally
-        {
-            // clean up
-            IOUtils.closeQuietly(out);
-            if (ios != null)
-            {
-                ios.close();
-            }
-            if (imageWriter != null)
-            {
-                imageWriter.dispose();
-            }
-        }
-    }
-
     // Creates an Image XObject from a Buffered Image using JAI Image I/O
     private static PDImageXObject createJPEG(PDDocument document, BufferedImage image,
                                              float quality, int dpi) throws IOException
@@ -227,7 +174,7 @@ public final class JPEGFactory extends I
 
         // create XObject
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        encodeImageToJPEGStream(image, quality, dpi, bos);
+        ImageIOUtil.writeImage(image, "jpeg", bos, dpi, quality);
         ByteArrayInputStream byteStream = new ByteArrayInputStream(bos.toByteArray());
         PDImageXObject pdImage = new PDImageXObject(new PDStream(document, byteStream, true), null);
         
@@ -238,7 +185,6 @@ public final class JPEGFactory extends I
         // alpha -> soft mask
         if (awtAlphaImage != null)
         {
-            encodeImageToJPEGStream(awtAlphaImage, quality, dpi, dict.createFilteredStream());
             PDImage xAlpha = JPEGFactory.createFromImage(document, awtAlphaImage, quality);
             dict.setItem(COSName.SMASK, xAlpha);
         }

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=1577878&r1=1577877&r2=1577878&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 Sat Mar 15 15:21:50 2014
@@ -13,9 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.pdfbox.pdmodel.graphics.image;
 
+import java.awt.Color;
+import java.awt.Graphics;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileInputStream;
@@ -33,15 +34,16 @@ import static org.junit.Assert.*;
  */
 public class JPEGFactoryTest extends TestCase
 {
-    
-    /** {@inheritDoc} */
+
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void setUp() throws Exception
     {
         super.setUp();
     }
 
-
     /**
      * Test of createFromStream method, of class JPEGFactory.
      */
@@ -58,12 +60,11 @@ public class JPEGFactoryTest extends Tes
         assertEquals(344, ximage.getWidth());
         assertEquals(287, ximage.getHeight());
         assertEquals("jpg", ximage.getSuffix());
-        
+
         //TODO shouldn't ximage.getImage() return a real image?
 //        assertNotNull(ximage.getImage());
 //        assertEquals(344, ximage.getImage().getWidth());
 //        assertEquals(287, ximage.getImage().getHeight());
-        
         document.close();
     }
 
@@ -73,11 +74,27 @@ public class JPEGFactoryTest extends Tes
     @Test
     public void testCreateFromImage() throws Exception
     {
-        
-        //TODO enable this test when JPEGFactory.createFromImage() works
+
         PDDocument document = new PDDocument();
-        BufferedImage bim = ImageIO.read(new File("src/test/resources/org/apache/pdfbox/pdmodel/graphics/image/jpeg.jpg"));
-        PDImageXObject ximage = JPEGFactory.createFromImage(document, bim);
+        BufferedImage rgbImage = ImageIO.read(new File("src/test/resources/org/apache/pdfbox/pdmodel/graphics/image/jpeg.jpg"));
+
+        // Create an ARGB image
+        int w = rgbImage.getWidth();
+        int h = rgbImage.getHeight();
+        BufferedImage argbImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+        Graphics ag = argbImage.getGraphics();
+        ag.drawImage(rgbImage, 0, 0, null);
+        ag.dispose();
+        // left half of image with 1/2 transparency
+        for (int x = 0; x < w / 2; ++x)
+        {
+            for (int y = 0; y < h; ++y)
+            {
+                argbImage.setRGB(x, y, rgbImage.getRGB(x, y) & 0x7FFFFFFF);
+            }
+        }
+
+        PDImageXObject ximage = JPEGFactory.createFromImage(document, rgbImage);
         assertNotNull(ximage);
         assertNotNull(ximage.getCOSStream());
         assertTrue(ximage.getCOSStream().getFilteredLength() > 0);
@@ -85,14 +102,20 @@ public class JPEGFactoryTest extends Tes
         assertEquals(344, ximage.getWidth());
         assertEquals(287, ximage.getHeight());
         assertEquals("jpg", ximage.getSuffix());
+        assertNull(ximage.getSoftMask());
+        
+//TODO when ARGB works        
+//        PDImageXObject ximage = JPEGFactory.createFromImage(document, argbImage);
+//        assertNotNull(ximage.getSoftMask());
+// etc...        
+
+
         
         //TODO shouldn't ximage.getImage() return a real image?
 //        assertNotNull(ximage.getImage());
 //        assertEquals(344, ximage.getImage().getWidth());
 //        assertEquals(287, ximage.getImage().getHeight());
-        
 //        document.close();
     }
 
-    
 }