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