Return-Path: X-Original-To: apmail-pdfbox-commits-archive@www.apache.org Delivered-To: apmail-pdfbox-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B24CD17444 for ; Wed, 8 Apr 2015 22:36:16 +0000 (UTC) Received: (qmail 84438 invoked by uid 500); 8 Apr 2015 22:36:16 -0000 Delivered-To: apmail-pdfbox-commits-archive@pdfbox.apache.org Received: (qmail 84412 invoked by uid 500); 8 Apr 2015 22:36:16 -0000 Mailing-List: contact commits-help@pdfbox.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@pdfbox.apache.org Delivered-To: mailing list commits@pdfbox.apache.org Received: (qmail 84403 invoked by uid 99); 8 Apr 2015 22:36:16 -0000 Received: from eris.apache.org (HELO hades.apache.org) (140.211.11.105) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 08 Apr 2015 22:36:16 +0000 Received: from hades.apache.org (localhost [127.0.0.1]) by hades.apache.org (ASF Mail Server at hades.apache.org) with ESMTP id 6223CAC01A7 for ; Wed, 8 Apr 2015 22:36:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1672207 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image: PDImage.java PDImageXObject.java Date: Wed, 08 Apr 2015 22:36:16 -0000 To: commits@pdfbox.apache.org From: jahewson@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20150408223616.6223CAC01A7@hades.apache.org> 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 */