Как поддерживать качество изображения с помощью FPDF и PHP?
Я использую 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 пикселей.
3 ответов
я столкнулся с той же проблемой в проектах для клиентов. Размытые изображения в сгенерированном 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);
scalefactor зависит от значения, заданного в конструкторе pdf-документа:
function FPDF($orientation='P',$unit='mm',$format='A4')
в значение по умолчанию - "mm". В большинстве моих документов я инициирую pdf-документ, например:
$pdf = new PDF('P');
это означает, что будет scalefactor 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
это дало мне изображение, которое было слишком большим. Но-и вот трюк-когда вы делите реальную ширину на scalefactor (в моем случае 2.83) и поместите это в это утверждение, оно дает совершенно четкий образ:
$this->Image('path/to/file', 0, 0, 71); // for a image width 200 / 2.83 = app 71
Я надеюсь, что это работает для вас тоже!
Я думаю, что проблема может быть связана с:
$image_height = 40;
$image_width = 40;
С помощью этих двух инструкций вы устанавливаете размеры изображения в формате pdf.
но если исходное изображение больше 40x40, масштабирование изображения может вызвать проблему качества.
Так что я предлагаю:
- сделайте правильный размер изображения (php предоставляет библиотеку GD). Измените размер до 40x40. Функция GD imagecopyresampled-ваш друг: изменение размера и перепроверь изображение! Полная ссылка: http://www.php.net/manual/en/function.imagecopyresampled.php
- вставьте теперь изображение в pdf
FPDF с такой инструкцией, чтобы установить пользовательский блок в mm $ pdf=новый 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 сделал очень хороший результат.