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(); } - }