Author: lehmi Date: Wed Nov 2 08:54:30 2022 New Revision: 1904994 URL: http://svn.apache.org/viewvc?rev=1904994&view=rev Log: PDFBOX-5526: add region and subsampling to masks as proposed by Velislava Yanchina
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java 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=1904994&r1=1904993&r2=1904994&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 Nov 2 08:54:30 2022 @@ -462,13 +462,14 @@ public final class PDImageXObject extend if (softMask != null) { image = applyMask(SampledImageReader.getRGBImage(this, region, subsampling, getColorKeyMask()), - softMask.getOpaqueImage(), softMask.getInterpolate(), true, extractMatte(softMask)); + softMask.getOpaqueImage(region, subsampling), softMask.getInterpolate(), true, + extractMatte(softMask)); } // explicit mask - to be applied only if /ImageMask true else if (mask != null && mask.isStencil()) { image = applyMask(SampledImageReader.getRGBImage(this, region, subsampling, getColorKeyMask()), - mask.getOpaqueImage(), mask.getInterpolate(), false, null); + mask.getOpaqueImage(region, subsampling), mask.getInterpolate(), false, null); } else { @@ -540,14 +541,33 @@ public final class PDImageXObject extend } /** - * Returns an RGB buffered image containing the opaque image stream without any masks applied. - * If this Image XObject is a mask then the buffered image will contain the raw mask. + * Returns an RGB buffered image containing the opaque image stream without any masks applied. If this Image XObject + * is a mask then the buffered image will contain the raw mask. + * * @return the image without any masks applied * @throws IOException if the image cannot be read */ public BufferedImage getOpaqueImage() throws IOException { - return SampledImageReader.getRGBImage(this, null); + return getOpaqueImage(null, 1); + } + + /** + * Returns an RGB buffered image containing the opaque image stream without any masks applied. If this Image XObject + * is a mask then the buffered image will contain the raw mask. + * + * @param region The region of the source image to get, or null if the entire image is needed. The actual region + * will be clipped to the dimensions of the source image. + * + * @param subsampling The amount of rows and columns to advance for every output pixel, a value of 1 meaning every + * pixel will be read. It must not be larger than the image width or height. + * + * @return the image without any masks applied + * @throws IOException if the image cannot be read + */ + public BufferedImage getOpaqueImage(Rectangle region, int subsampling) throws IOException + { + return SampledImageReader.getRGBImage(this, region, subsampling, null); } /** Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java?rev=1904994&r1=1904993&r2=1904994&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java Wed Nov 2 08:54:30 2022 @@ -78,7 +78,7 @@ class CCITTFactoryTest PDImageXObject ximage3 = CCITTFactory.createFromFile(document, new File(tiffG3Path)); validate(ximage3, 1, 344, 287, "tiff", PDDeviceGray.INSTANCE.getName()); BufferedImage bim3 = ImageIO.read(new File(tiffG3Path)); - checkIdent(bim3, ximage3.getOpaqueImage()); + checkIdent(bim3, ximage3.getOpaqueImage(null, 1)); PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); try (PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, false)) @@ -89,7 +89,7 @@ class CCITTFactoryTest PDImageXObject ximage4 = CCITTFactory.createFromFile(document, new File(tiffG4Path)); validate(ximage4, 1, 344, 287, "tiff", PDDeviceGray.INSTANCE.getName()); BufferedImage bim4 = ImageIO.read(new File(tiffG3Path)); - checkIdent(bim4, ximage4.getOpaqueImage()); + checkIdent(bim4, ximage4.getOpaqueImage(null, 1)); page = new PDPage(PDRectangle.A4); document.addPage(page); try (PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, false)) @@ -133,7 +133,7 @@ class CCITTFactoryTest } BufferedImage bim = imageReader.read(pdfPageNum); validate(ximage, 1, bim.getWidth(), bim.getHeight(), "tiff", PDDeviceGray.INSTANCE.getName()); - checkIdent(bim, ximage.getOpaqueImage()); + checkIdent(bim, ximage.getOpaqueImage(null, 1)); PDPage page = new PDPage(PDRectangle.A4); float fX = ximage.getWidth() / page.getMediaBox().getWidth(); float fY = ximage.getHeight() / page.getMediaBox().getHeight(); @@ -168,7 +168,7 @@ class CCITTFactoryTest BufferedImage bim = ImageIO.read(new File(tiffG4Path)); PDImageXObject ximage3 = CCITTFactory.createFromImage(document, bim); validate(ximage3, 1, 344, 287, "tiff", PDDeviceGray.INSTANCE.getName()); - checkIdent(bim, ximage3.getOpaqueImage()); + checkIdent(bim, ximage3.getOpaqueImage(null, 1)); PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); @@ -205,7 +205,7 @@ class CCITTFactoryTest PDImageXObject ximage3 = CCITTFactory.createFromImage(document, bim); validate(ximage3, 1, 343, 287, "tiff", PDDeviceGray.INSTANCE.getName()); - checkIdent(bim, ximage3.getOpaqueImage()); + checkIdent(bim, ximage3.getOpaqueImage(null, 1)); PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java?rev=1904994&r1=1904993&r2=1904994&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java Wed Nov 2 08:54:30 2022 @@ -165,7 +165,7 @@ class LosslessFactoryTest PDImageXObject ximage = LosslessFactory.createFromImage(document, argbImage); validate(ximage, 8, argbImage.getWidth(), argbImage.getHeight(), "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(argbImage, ximage.getImage()); - checkIdentRGB(argbImage, ximage.getOpaqueImage()); + checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, argbImage.getWidth(), argbImage.getHeight(), "png", PDDeviceGray.INSTANCE.getName()); @@ -239,7 +239,7 @@ class LosslessFactoryTest validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(argbImage, ximage.getImage()); - checkIdentRGB(argbImage, ximage.getOpaqueImage()); + checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, w, h, "png", PDDeviceGray.INSTANCE.getName()); @@ -281,7 +281,7 @@ class LosslessFactoryTest validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(rgbImage, ximage.getImage()); - checkIdentRGB(rgbImage, ximage.getOpaqueImage()); + checkIdentRGB(rgbImage, ximage.getOpaqueImage(null, 1)); assertNull(ximage.getSoftMask()); @@ -308,7 +308,7 @@ class LosslessFactoryTest int h = image.getHeight(); validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(image, ximage.getImage()); - checkIdentRGB(image, ximage.getOpaqueImage()); + checkIdentRGB(image, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 1, w, h, "png", PDDeviceGray.INSTANCE.getName()); @@ -339,7 +339,7 @@ class LosslessFactoryTest int h = image.getHeight(); validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(image, ximage.getImage()); - checkIdentRGB(image, ximage.getOpaqueImage()); + checkIdentRGB(image, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 1, w, h, "png", PDDeviceGray.INSTANCE.getName()); @@ -501,7 +501,7 @@ class LosslessFactoryTest PDImageXObject ximage = LosslessFactory.createFromImage(document, argbImage); validate(ximage, 8, width, height, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(argbImage, ximage.getImage()); - checkIdentRGB(argbImage, ximage.getOpaqueImage()); + checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 1, width, height, "png", PDDeviceGray.INSTANCE.getName()); @@ -662,7 +662,7 @@ class LosslessFactoryTest int h = image.getHeight(); validate(ximage, 16, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(image, ximage.getImage()); - checkIdentRGB(image, ximage.getOpaqueImage()); + checkIdentRGB(image, ximage.getOpaqueImage(null, 1)); checkIdentRaw(image, ximage); assertNotNull(ximage.getSoftMask()); Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java?rev=1904994&r1=1904993&r2=1904994&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java Wed Nov 2 08:54:30 2022 @@ -100,7 +100,7 @@ public class ValidateXImage writeOk = ImageIO.write(ximage.getImage(), format, new NullOutputStream()); assertTrue(writeOk); } - writeOk = ImageIO.write(ximage.getOpaqueImage(), format, new NullOutputStream()); + writeOk = ImageIO.write(ximage.getOpaqueImage(null, 1), format, new NullOutputStream()); assertTrue(writeOk); }