【问题标题】:How to precisely place a cropped and resized image with PDFlib?如何使用 PDFlib 精确放置裁剪和调整大小的图像?
【发布时间】:2016-08-09 09:27:30
【问题描述】:

为此苦苦挣扎了几个小时,但无法弄清楚 PDFlib 的工作原理。我有这张图片,我们会说它的大小为 1000 x 300 像素:

现在我想将图像的一部分放入一个 20 x 12 毫米(300 dpi)的盒子中。调整大小必须使得如果没有进行裁剪,图像将在页面上占据 70 x 21 毫米。必须从顶部裁剪 3 毫米的图像,从左侧裁剪 2 毫米。

示例和文档太弱了,我无法准确理解 fit_image() 的参数是如何工作的。我该如何做到这一点?

注意:我在 PHP 中执行此操作,但我想主要关注的是 PDFlib 需要哪些参数,这些参数与语言无关。

【问题讨论】:

    标签: php image crop pdflib


    【解决方案1】:

    解决这个问题需要几个步骤,但当然很容易。您的问题包含必须解决的各种任务:

    1. 将输入图像缩小到给定区域
    2. 剪辑此按比例缩小的图像
    3. 将图像缩放并剪裁到给定位置。 (这在您的问题中并不完全清楚,因此您可以根据需要调整 fit_image() 的 x/y 参数。

    这是解决它的一种方法:

    # Load the image
    $image = $p->load_image("auto", $imagefile, "");
    
    # First we retrieve the dimension and the resolution for the loaded image
    $imagewidth = $p->info_image($image, "imagewidth", "");
    $imageheight = $p->info_image($image, "imageheight", "");
    $dpix = $p->info_image($image, "resx", "");
    $dpiy = $p->info_image($image, "resy", "");
    
    # Calculate the scale factor, to fit the image to a width/height of 70 x 21 mm.
    # Use a helper function to calculate the mm-values to the PDF points
    $scalex = mm2pt(70) / $imagewidth; 
    $scaley = mm2pt(21) / $imageheight; 
    
    # For demonstrating the correct placing, fit the loaded image with a
    # size of 70x21 mm with a light opacity (scaling it to this dimension
    # might distort the image ratio) (final code would not include this)
    $gstate = $p->create_gstate("opacityfill=.4");
    $optlist = sprintf("gstate=%d scale {%f %f} dpi=72",
                    $gstate, $scalex, $scaley);
    $p->fit_image($image, mm2pt(10), mm2pt(250), $optlist);
    
    # Use dpi=72 to ignore the internal DPI value and interpret each image 
    # pixel without scaling.
    # Now, specify the partial area with a matchbox clipping (remember that
    # those values are the positions within the 70x21, and y goes from bottom to top)
    $optlist = sprintf("scale {%f %f} matchbox={clipping={%f %f %f %f}} dpi=72", 
                        $scalex, $scaley, mm2pt(2)/$scalex, mm2pt(6)/$scaley, 
                        mm2pt(22)/$scalex, mm2pt(18)/$scaley);
    
    # Set the reference point, so the origin of the clipped image will be the 
    # same as for the original image
    $p->fit_image($image, mm2pt(10)+mm2pt(2), mm2pt(250)+mm2pt(6), $optlist);
    
    function mm2pt($mm){
        return $mm*2.83465;
    }
    

    因此,当使用此代码和 PDFlib 示例图像之一将部分图像放置在原始图像之上时,我得到以下输出:

    【讨论】:

    • 我没有看到您将图像上方的 3 毫米以及 20 和 12 毫米的宽度/高度设置在哪里?我想这几乎是我不明白的剪贴框的数字......
    • 现在想通了。从 21 毫米中减去 3 毫米,因此 18 作为最后一个剪裁值。将 20 mm 的宽度添加到图像的左侧,因此 22 作为第三个剪切值。 12 毫米的高度是第二个和最后一个剪裁值之间的差值。
    • 嗯,图片的参考点是左下角。从那里你必须进行计算。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2014-03-24
    • 2023-03-09
    • 2020-09-15
    相关资源
    最近更新 更多