You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by "Jani Pehkonen (Jira)" <ji...@apache.org> on 2020/06/09 17:34:00 UTC

[jira] [Commented] (PDFBOX-4850) Image rendering issue

    [ https://issues.apache.org/jira/browse/PDFBOX-4850?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17129658#comment-17129658 ] 

Jani Pehkonen commented on PDFBOX-4850:
---------------------------------------

Replace method drawBufferedImage() in class org.apache.pdfbox.rendering.PageDrawer with this:


{code:java}
    private void drawBufferedImage(BufferedImage image, AffineTransform at) throws IOException
    {
        graphics.setComposite(getGraphicsState().getNonStrokingJavaComposite());
        setClip();
        AffineTransform imageTransform = new AffineTransform(at);
        int width = image.getWidth();
        int height = image.getHeight();
        imageTransform.scale(1.0 / width, -1.0 / height);
        imageTransform.translate(0, -height);

        PDSoftMask softMask = getGraphicsState().getSoftMask();
        if( softMask != null )
        {
            Rectangle2D rectangle = new Rectangle2D.Float(0, 0, width, height);
            Paint awtPaint = new TexturePaint(image, rectangle);
            awtPaint = applySoftMaskToPaint(awtPaint, softMask);
            graphics.setPaint(awtPaint);

            AffineTransform originalTransform = graphics.getTransform();
            graphics.transform(imageTransform);
            graphics.fill(rectangle);
            graphics.setTransform(originalTransform);
        }
        else
        {
            COSBase transfer = getGraphicsState().getTransfer();
            if (transfer instanceof COSArray || transfer instanceof COSDictionary)
            {
                image = applyTransferFunction(image, transfer);
            }

            // PDFBOX-4516, PDFBOX-4527, PDFBOX-4815:
            // graphics.drawImage() has terrible quality when scaling down, even when
            // RenderingHints.VALUE_INTERPOLATION_BICUBIC, VALUE_ALPHA_INTERPOLATION_QUALITY,
            // VALUE_COLOR_RENDER_QUALITY and VALUE_RENDER_QUALITY are all set.
            // A workaround is to get a pre-scaled image with Image.getScaledInstance()
            // and then draw that one. To reduce differences in testing
            // (partly because the method needs integer parameters), only smaller scalings
            // will trigger the workaround. Because of the slowness we only do it if the user
            // expects quality rendering and interpolation.
            Matrix m = new Matrix(imageTransform);
            float scaleX = Math.abs(m.getScalingFactorX());
            float scaleY = Math.abs(m.getScalingFactorY());
            Image imageToDraw = image;

            if ((scaleX < 0.25f || scaleY < 0.25f) &&
                RenderingHints.VALUE_RENDER_QUALITY.equals(graphics.getRenderingHint(RenderingHints.KEY_RENDERING)) &&
                RenderingHints.VALUE_INTERPOLATION_BICUBIC.equals(graphics.getRenderingHint(RenderingHints.KEY_INTERPOLATION)))
            {
                int w = Math.round(image.getWidth() * scaleX);
                int h = Math.round(image.getHeight() * scaleY);
                if (w < 1)
                {
                    w = 1;
                }
                if (h < 1)
                {
                    h = 1;
                }
                imageToDraw = image.getScaledInstance(
                        w,
                        h,
                        Image.SCALE_SMOOTH);
                imageTransform.scale(1 / scaleX, 1 / scaleY); // remove the scale
            }
            graphics.drawImage(imageToDraw, imageTransform, null);
        }
    }

{code}

I have applied imageTransform to the Graphics2D object. This way imageTransform rotates and scales the image and the anchor rectangle of the TexturePaint. Now also the dimensions of the anchor rectangle are simply width and height.
This fixes also issue PDFBOX-4798.

> Image rendering issue
> ---------------------
>
>                 Key: PDFBOX-4850
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-4850
>             Project: PDFBox
>          Issue Type: Bug
>          Components: Rendering
>    Affects Versions: 2.0.19
>            Reporter: Daniel Persson
>            Priority: Minor
>         Attachments: issue-pdfbox.jpg, issue-poppler.jpg, issue.pdf
>
>
> Rendering file using PDFToImage creates a strange result where embedded images aren't rotated or scaled correctly.
>  
> Rendering the same PDF using poppler will create a correct looking output.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: dev-help@pdfbox.apache.org