You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2015/04/09 00:36:16 UTC
svn commit: r1672207 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image:
PDImage.java PDImageXObject.java
Author: jahewson
Date: Wed Apr 8 22:36:16 2015
New Revision: 1672207
URL: http://svn.apache.org/r1672207
Log:
PDFBOX-2750: Perform high-quality upscaling of image masks
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java?rev=1672207&r1=1672206&r2=1672207&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java Wed Apr 8 22:36:16 2015
@@ -34,6 +34,7 @@ public interface PDImage extends COSObje
{
/**
* Returns the content of this image as an AWT buffered image with an (A)RGB color space.
+ * The size of the returned image is the larger of the size of the image itself or its mask.
* @return content of this image as a buffered image.
* @throws IOException
*/
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1672207&r1=1672206&r2=1672207&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Wed Apr 8 22:36:16 2015
@@ -16,6 +16,7 @@
*/
package org.apache.pdfbox.pdmodel.graphics.image;
+import java.awt.RenderingHints;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSName;
@@ -244,19 +245,20 @@ public final class PDImageXObject extend
int width = image.getWidth();
int height = image.getHeight();
- // compose to ARGB
- BufferedImage masked = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-
- // scale mask to fit image
- if (mask.getWidth() != width || mask.getHeight() != height)
+ // scale mask to fit image, or image to fit mask, whichever is larger
+ if (mask.getWidth() < width || mask.getHeight() < height)
{
- BufferedImage mask2 = new BufferedImage(width, height, mask.getType());
- Graphics2D g = mask2.createGraphics();
- g.drawImage(mask, 0, 0, width, height, 0, 0, mask.getWidth(), mask.getHeight(), null);
- g.dispose();
- mask = mask2;
+ mask = scaleImage(mask, width, height);
+ }
+ else if (mask.getWidth() > width || mask.getHeight() > height)
+ {
+ width = mask.getWidth();
+ height = mask.getHeight();
+ image = scaleImage(image, width, height);
}
+ // compose to ARGB
+ BufferedImage masked = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
WritableRaster src = image.getRaster();
WritableRaster dest = masked.getRaster();
WritableRaster alpha = mask.getRaster();
@@ -292,6 +294,22 @@ public final class PDImageXObject extend
}
/**
+ * High-quality image scaling.
+ */
+ private BufferedImage scaleImage(BufferedImage image, int width, int height)
+ {
+ BufferedImage image2 = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = image2.createGraphics();
+ g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING,
+ RenderingHints.VALUE_RENDER_QUALITY);
+ g.drawImage(image, 0, 0, width, height, 0, 0, image.getWidth(), image.getHeight(), null);
+ g.dispose();
+ return image2;
+ }
+
+ /**
* Returns the Mask Image XObject associated with this image, or null if there is none.
* @return Mask Image XObject
*/