[ https://issues.apache.org/jira/browse/PDFBOX-4184?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16528728#comment-16528728 ]
Tilman Hausherr edited comment on PDFBOX-4184 at 6/30/18 2:05 PM: ------------------------------------------------------------------ There's a new problem and I don't know why this didn't come up before. See this code: {code:java} public void testCreateLosslessFrom16BitPNG() throws IOException { PDDocument document = new PDDocument(); BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("16bit.png")); assertEquals(64, image.getColorModel().getPixelSize()); assertEquals(Transparency.TRANSLUCENT, image.getColorModel().getTransparency()); assertEquals(4, image.getRaster().getNumDataElements()); assertEquals(java.awt.image.DataBuffer.TYPE_USHORT, image.getRaster().getDataBuffer().getDataType()); PDImageXObject ximage = LosslessFactory.createFromImage(document, image); int w = image.getWidth(); int h = image.getHeight(); validate(ximage, 16, w, h, "png", PDDeviceRGB.INSTANCE.getName()); System.out.println(ximage.getImage()); checkIdent(image, ximage.getImage()); checkIdentRGB(image, ximage.getOpaqueImage()); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, w, h, "png", PDDeviceGray.INSTANCE.getName()); assertEquals(35, colorCount(ximage.getSoftMask().getImage())); doWritePDF(document, ximage, testResultsDir, "png16bit.pdf"); } {code} The test fails because the softmask is all 0. For some reason, {{alphaImageData}} is not filled when {{prepareImageXObject}} is called by {{preparePredictorPDImage}}. Could it be that when the PredictorEncoder path is taken, that you forgot to handle the transparency? was (Author: tilman): There's a new problem and I don't know why this didn't come up before. See this code: {code:java} public void testCreateLosslessFrom16BitPNG() throws IOException { PDDocument document = new PDDocument(); BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("16bit.png")); assertEquals(64, image.getColorModel().getPixelSize()); assertEquals(Transparency.TRANSLUCENT, image.getColorModel().getTransparency()); assertEquals(4, image.getRaster().getNumDataElements()); assertEquals(java.awt.image.DataBuffer.TYPE_USHORT, image.getRaster().getDataBuffer().getDataType()); PDImageXObject ximage = LosslessFactory.createFromImage(document, image); int w = image.getWidth(); int h = image.getHeight(); validate(ximage, 16, w, h, "png", PDDeviceRGB.INSTANCE.getName()); System.out.println(ximage.getImage()); checkIdent(image, ximage.getImage()); checkIdentRGB(image, ximage.getOpaqueImage()); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, w, h, "png", PDDeviceGray.INSTANCE.getName()); assertEquals(35, colorCount(ximage.getSoftMask().getImage())); doWritePDF(document, ximage, testResultsDir, "png16bit.pdf"); } {code} The test fails because the softmask is all 0. For some reason, {{alphaImageData}} is not filled when {{prepareImageXObject}} is called by {{preparePredictorPDImage}}. > [PATCH]: Support simple lossless compression of 16 bit RGB images > ----------------------------------------------------------------- > > Key: PDFBOX-4184 > URL: https://issues.apache.org/jira/browse/PDFBOX-4184 > Project: PDFBox > Issue Type: Improvement > Components: Writing > Affects Versions: 2.0.9 > Reporter: Emmeran Seehuber > Priority: Minor > Fix For: 2.0.12, 3.0.0 PDFBox > > Attachments: 16bit.png, LoadGovdocs.java, > lossless_predictor_based_imageencoding.patch, > lossless_predictor_based_imageencoding_v2.patch, > lossless_predictor_based_imageencoding_v3.patch, > lossless_predictor_based_imageencoding_v4.patch, > lossless_predictor_based_imageencoding_v5.patch, > pdfbox_support_16bit_image_write.patch, png16-arrow-bad-no-smask.pdf, > png16-arrow-bad.pdf, png16-arrow-good-no-mask.pdf, png16-arrow-good.pdf > > > The attached patch add support to write 16 bit per component images > correctly. I've integrated a test for this here: > [https://github.com/rototor/pdfbox-graphics2d/commit/8bf089cb74945bd4f0f15054754f51dd5b361fe9] > It only supports 16-Bit TYPE_CUSTOM with DataType == USHORT images - but this > is what you usually get when you read a 16 bit PNG file. > This would also fix [https://github.com/danfickle/openhtmltopdf/issues/173]. > The patch is against 2.0.9, but should apply to 3.0.0 too. > There is still some room for improvements when writing lossless images, as > the images are currently not efficiently encoded. I.e. you could use PNG > encodings to get a better compression. (By adding a COSName.DECODE_PARMS with > a COSName.PREDICTOR == 15 and encoding the images as PNG). But this is > something for a later patch. It would also need another API, as there is a > tradeoff speed vs compression ratio. -- This message was sent by Atlassian JIRA (v7.6.3#76005) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org