Как сохранить качество изображения с FPDF и PHP?

Я использую FPDF с PHP для добавления изображения в PDF. Но качество изображения в PDF намного хуже, чем исходное изображение, как вы можете видеть здесь:

Print screen from web page Print screen from PDF

Соответствующий код:

<code>$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");
</code>

Исходное изображение 150х150 пикселей.

 Luke Barker19 мар. 2014 г., 15:07
TCPDF является альтернативой - хотя вы, вероятно, не хотите этого слышать! Вы можете попробовать это для сравнения качества, однако, если это не связано с библиотекой.
 Scott28 сент. 2013 г., 03:20
У меня тоже есть эта проблема, ты разобрался? Может быть, я могу спросить об этом по-другому ... Если изображение имеет размер 100 x 100 пикселей, то какую ширину и высоту FPDF следует использовать, чтобы гарантировать отсутствие масштабирования изображения?

Ответы на вопрос(3)

Я думаю, что проблема может быть связана с:

 $image_height = 40;
 $image_width = 40;

С помощью этих двух инструкций вы устанавливаете размеры изображения в формате PDF.

Но если исходное изображение больше 40х40, его масштабирование может вызвать проблемы с качеством.

Итак, что я предлагаю:

Do a correct resize of the image (php provides GD library). Resize it to 40x40. The GD function imagecopyresampled is your friend: resize and resample the image! Complete reference: http://www.php.net/manual/en/function.imagecopyresampled.php Insert now the image in the pdf
 06 апр. 2012 г., 09:41
Хорошо, если в вашем pdf вы хотите изображение 150x150, измените первые две строки вашего файла: с $ image_height = 150; $ image_width = 150;
 06 апр. 2012 г., 10:49
Если просто $ image_height = 150; $ image_width = 150; $ pdf = новый FPDF (); ...?
 chejnik06 апр. 2012 г., 10:19
Я установил $ pdf = new FPDF («P», «mm», «A4»); Таким образом, я определяю пользовательскую единицу в мм и преобразую пиксель в мм (150 пикселей соответствует 39,6875). И все же изображение хуже по качеству.
 chejnik06 апр. 2012 г., 10:05
Модули, используемые в fdpf, мне не понятны. Как сказано в руководстве, например, для ширины - ширина изображения на странице. Существует три случая: Если значение положительное, оно представляет ширину в пользовательской единице. Если значение отрицательное, абсолютное значение представляет горизонтальное разрешение в dpi. Если значение не указано или равно нулю, оно вычисляется автоматически. Я не уверен, как установить в пользовательских единицах измерения пиксели или какое разрешение использовать для получения немасштабируемых изображений. Tx.
 chejnik06 апр. 2012 г., 09:40
Спасибо за предложение. Дело в том, что я хочу сохранить исходную ширину и высоту (150x150 пикселей). Какие значения для $ image_height и $ image_width я должен установить, чтобы сохранить исходную ширину и высоту?

FPDF с таким утверждением, чтобы установить пользовательскую единицу в мм $ 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 сделал очень красивый результат.

Решение Вопроса

Я сталкивался с такой же проблемой в проектах для клиентов. Размытые изображения в сгенерированном документе 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

Я надеюсь, что это работает и для вас!

 05 дек. 2018 г., 02:17
Это решение работает только для уменьшения изображения. Допустим, исходное изображение действительно имеет высокое разрешение. Использование этого решения для соотношения 1: 1 (rawwidth: pdfwidth) не поможет.

Ваш ответ на вопрос