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 2012/11/07 22:09:35 UTC
svn commit: r1406807 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject:
CompositeImage.java PDJpeg.java
Author: lehmi
Date: Wed Nov 7 21:09:35 2012
New Revision: 1406807
URL: http://svn.apache.org/viewvc?rev=1406807&view=rev
Log:
PDFBOX-1440: added stencil mask support
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java
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/CompositeImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java?rev=1406807&r1=1406806&r2=1406807&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java Wed Nov 7 21:09:35 2012
@@ -17,6 +17,7 @@
package org.apache.pdfbox.pdmodel.graphics.xobject;
import java.awt.image.BufferedImage;
+import java.awt.image.WritableRaster;
import java.io.IOException;
import org.apache.pdfbox.cos.COSArray;
@@ -56,6 +57,11 @@ public class CompositeImage
/**
* This method applies the specified transparency mask to a given image and returns a new BufferedImage
* whose alpha values are computed from the transparency mask (smask) image.
+ *
+ * @param decodeArray the decode array
+ * @return the masked image
+ * @throws IOException if something went wrong
+ *
*/
public BufferedImage createMaskedImage(COSArray decodeArray) throws IOException
{
@@ -71,7 +77,6 @@ public class CompositeImage
final int baseImageWidth = baseImage.getWidth();
final int baseImageHeight = baseImage.getHeight();
-
BufferedImage result = new BufferedImage(baseImageWidth, baseImageHeight, BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < baseImageWidth; x++)
{
@@ -101,4 +106,32 @@ public class CompositeImage
}
return result;
}
+
+ /**
+ * This method applies the specified stencil mask to a given image and returns a new BufferedImage
+ * whose alpha values are computed from the stencil mask (smask) image.
+ *
+ * @return the stencil masked image
+ */
+ public BufferedImage createStencilMaskedImage()
+ {
+ final int baseImageWidth = baseImage.getWidth();
+ final int baseImageHeight = baseImage.getHeight();
+ WritableRaster maskRaster = smaskImage.getRaster();
+ BufferedImage result = new BufferedImage(baseImageWidth, baseImageHeight, BufferedImage.TYPE_INT_ARGB);
+ int[] alpha = new int[1];
+ for (int x = 0; x < baseImageWidth; x++)
+ {
+ for (int y = 0; y < baseImageHeight; y++)
+ {
+ maskRaster.getPixel(x, y, alpha);
+ // We need to remove any alpha value in the main image.
+ int rgbOnly = 0x00FFFFFF & baseImage.getRGB(x, y);
+ int alphaOnly = alpha[0] == 0 ? 0xFF000000 : 0;
+ result.setRGB(x, y, rgbOnly | alphaOnly);
+ }
+ }
+ return result;
+ }
+
}
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=1406807&r1=1406806&r2=1406807&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 Wed Nov 7 21:09:35 2012
@@ -43,7 +43,7 @@ import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
-import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
@@ -279,20 +279,27 @@ public class PDJpeg extends PDXObjectIma
bi = ImageIO.read(bai);
}
- // If there is a 'soft mask' image then we use that as a transparency mask.
- PDXObjectImage smask = getSMaskImage();
- if (smask != null)
- {
- BufferedImage smaskBI = smask.getRGBImage();
-
- COSArray decodeArray = smask.getDecode();
- CompositeImage compositeImage = new CompositeImage(bi, smaskBI);
- BufferedImage rgbImage = compositeImage.createMaskedImage(decodeArray);
-
+ // If there is a 'soft mask' or 'mask' image then we use that as a transparency mask.
+ PDXObjectImage maskImage = getSMaskImage();
+ if (maskImage != null)
+ {
+ CompositeImage compositeImage = new CompositeImage(bi, maskImage.getRGBImage());
+ BufferedImage rgbImage = compositeImage.createMaskedImage(maskImage.getDecode());
image = rgbImage;
}
else
{
+ COSBase mask = getMask();
+ if (mask != null && mask instanceof COSDictionary)
+ {
+ maskImage = (PDXObjectImage)PDXObject.createXObject(mask);
+ CompositeImage compositeImage = new CompositeImage(bi, maskImage.getRGBImage());
+ BufferedImage rgbImage = compositeImage.createStencilMaskedImage();
+ image = rgbImage;
+ }
+ }
+ if (image == null)
+ {
// But if there is no soft mask, use the unaltered image.
image = bi;
}