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