【问题标题】:How to maintain image quality with FPDF and PHP?如何使用 FPDF 和 PHP 保持图像质量?
【发布时间】:2012-04-06 07:10:45
【问题描述】:

我正在使用 FPDF 和 PHP 将图像添加到 PDF。但是 PDF 中的图像质量比原始图像差很多,您可以在此处看到:

相关代码:

$image_height = 40;
$image_width = 40;
$pdf = new FPDF();
$pdf->AddPage();
$start_x = $pdf->GetX();
$start_y = $pdf->GetY();
$pdf->Image('./images/ds_pexeso_ros_0_17.jpg', $pdf->GetX(), $pdf->GetY(), $image_height, $image_width); 
$pdf->Output("pexeso".date("Y-m-d"),"I");

原始图像为 150x150 像素。

【问题讨论】:

  • 我也有这个问题,你解决了吗?也许我可以换一种方式问它...如果图像是 100 像素 x 100 像素,用于确保不会发生图像缩放的 FPDF 宽度和高度是多少?
  • TCPPDF 是另一种选择 - 尽管您可能不想听到这个!您可以尝试比较质量,但如果它与库无关。

标签: php image fpdf


【解决方案1】:

我在客户项目中遇到了同样的问题。 即使是雇员图像,生成的 pdf 文档中的图片也会模糊。

我花了几个小时,但这对我有用。

我查看了代码,发现在 pdf 文档的构造函数中设置了比例因子:

//Scale factor
if($unit=='pt')
    $this->k=1;
elseif($unit=='mm')
    $this->k=72/25.4;
elseif($unit=='cm')
    $this->k=72/2.54;
elseif($unit=='in')
    $this->k=72;
else
    $this->Error('Incorrect unit: '.$unit);

比例因子取决于pdf文档的构造函数中给出的值:

function FPDF($orientation='P',$unit='mm',$format='A4')

默认为“毫米”。在我的大多数文档中,我都会创建一个 pdf 文档,例如:

$pdf = new PDF('P');

这意味着将使用 72/25.4 = 2.83 的比例因子。 当我刚刚使用之前放置图像时:

$this->Image('path/to/file', 0, 0);

这样我得到了模糊的图像。 也可以在命令中给出图片的宽度

$this->Image('path/to/file', 0, 0, 200); // for a image width 200

这给了我一个太大的图像。但是 - 诀窍来了 - 当您将实际宽度除以比例因子(在我的情况下为 2.83)并将其放在此语句中时,它会给出一个非常清晰的图像:

$this->Image('path/to/file', 0, 0, 71); // for a image width 200 / 2.83 = app 71

我希望这对你也有用!

【讨论】:

  • 此解决方案仅适用于缩小图像。假设原始图像非常高清。将此解决方案用于 1:1 比例(rawwidth:pdfwidth)将无法做到。
【解决方案2】:

我认为问题可能与:

 $image_height = 40;
 $image_width = 40;

通过这两个说明,您可以设置图像在 pdf 中的尺寸。

但如果原始图像大于 40x40,则图像的缩放可能会导致质量问题。

所以我的建议是:

【讨论】:

  • 感谢您的建议。事实是我想保持原来的宽度和高度(150x150 像素)。我应该为 $image_height 和 $image_width 设置什么值以保持原始宽度和高度?
  • 好吧,如果在您的 pdf 中您想要 150x150 的图像,那么更改文件的前两行: $image_height = 150; $image_width = 150;
  • fdpf 中使用的单位我不清楚。正如手册中所说,例如宽度 - 页面中图像的宽度。分三种情况: 如果值为正,则以用户单位表示宽度 如果值为负,则绝对值以 dpi 为单位表示水平分辨率 如果该值不指定或等于 0,则自动计算。我不确定如何将我的用户单位设置为像素或使用什么分辨率来实现不缩放图像。发送。
  • 我设置了 $pdf = new FPDF("P", "mm", "A4");这样,我将用户单位定义为 mm,并将 px 转换为 mm(150px 对应于 39.6875)。图像质量仍然较差。
  • 如果只是 $image_height = 150; $image_width = 150; $pdf = 新的 FPDF(); ... ?
【解决方案3】:

FPDF 使用这样的语句将用户单位设置为 mm $pdf=new FPDF('P','mm','Letter');

<?php 

    require_once('fpdf.php');
    $image_height = 40;
    $image_width = 40;
    $pdf = new FPDF('P','mm','Letter');
    $pdf->AddPage();
    $start_x = $pdf->GetX();
    $start_y = $pdf->GetY();
    $pdf->Image('./images/ds_pexeso_ros_0_17.jpg',$start_x+0,$start_y-2,40);
   $pdf->Output("pexeso".date("Y-m-d"),"I");
?>

FPDF 的效果非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 2020-02-19
    • 2019-12-27
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多