PHP-Отображение изображений Imagemagick

#php #imagemagick #imagick

#php #imagemagick #imagick

Вопрос:

У меня есть php-код, который создает миниатюру pdf следующим образом;

 <?php
$file ="test.pdf";
$im = new imagick(realpath($file).'[0]');
$im->setImageFormat("png");
$im->resizeImage(200,200,1,0);
header("Content-Type: image/jpeg");
$thumbnail = $im->getImageBlob();
echo $thumbnail;
?>
  

Который работает хорошо. Но если я хочу отобразить изображение на веб-странице, я должен использовать <img src=""> тег. Есть ли какой-либо способ удалить header("Content-Type: image/jpeg");
из синтаксиса и эхо-изображения, используя <img src=""> ..? Или кто-нибудь подскажет мне, как использовать синтаксис для отображения изображения внутри веб-страницы.

Я запускаю apache с php5 на моем ПК с Windows Vista..

Ответ №1:

С Imagick вы могли бы использовать кодировку base64:

 echo '<img src="data:image/jpg;base64,'.base64_encode($img->getImageBlob()).'" alt="" />';`
  

Однако этот метод довольно медленный, и поэтому я рекомендую сгенерировать и сохранить изображение раньше $img->writeImage($path) .

Ответ №2:

вы можете попробовать отобразить изображение таким образом:

 // start buffering
ob_start();
$thumbnail = $im->getImageBlob();
$contents =  ob_get_contents();
ob_end_clean();

echo "<img src='data:image/jpg;base64,".base64_encode($contents)."' />";
  

Комментарии:

1. я думаю, что это должно быть похоже echo "<img src='data:image/jpg;base64,".base64_encode($thumbnail)."' />";

2. Я согласен с @ashein, что лучшим решением является создание эскизов и их использование.

Ответ №3:

Встраивание изображения с использованием base64 — это СОВЕРШЕННО неправильный способ решения проблемы, особенно. с помощью чего-то без состояния, например веб-скрипта php.

Вместо этого вы должны использовать параметры http, чтобы иметь один php-файл, который может выполнять две задачи — по умолчанию будет отправляться html, а параметр будет указывать php-файлу распечатать изображение. Ниже приведен «стандартный» способ сделать это —

 <?php
if (!array_key_exists('display',$_GET))
{
    print('<html><head></head><body><img src="'.$_SERVER['PHP_SELF'].'?display=image"></body></html>');
} else
{
    // The display key exists which means we want to display an image
    $file ="test.pdf";
    $im = new imagick(realpath($file).'[0]');
    $im->setImageFormat("png");
    $im->resizeImage(200,200,1,0);
    header("Content-Type: image/jpeg");
    $thumbnail = $im->getImageBlob();
    echo $thumbnail;
}
?>
  

Ответ №4:

Вы можете встроить необработанное изображение на свою страницу, смотрите Запись в блоге ниже для примера синтаксиса страницы.

http://www.sveinbjorn.org/news/2005-11-28-02-39-23

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

Ответ №5:

Как я вижу, слишком много ответов недостаточно точны, поэтому вот мой:

Это приведет к печати изображения так, как вы делаете это сейчас (на момент задания этого вопроса). В качестве альтернативы ответу @Vasil Dakov вам следует изменить фрагмент, который я вам дал, следующим образом:

 <?php
// ... Image generation goes here
header("Content-Type: image/jpeg"); 
ob_start();
print $im->getImageBlob();
$the_outputted_image = ob_get_flush();
?>
// Assuming that you use MVC approach and you are storing $the_outputted_image in a object and passing it to the view(ie. index.html or the HTML below the code).
//... Html code of index.html
<img src="data:image/jpg;base64 <?php print $the_outputted_image; ?>" alt="image" title="IMagick Generated Image" />
  

В качестве другой альтернативы можно создать скрипт для генерации изображения, сохранить его в какой-либо папке (предполагая, что img / является папкой) и возвращать только путь имя файла расширение к файлу:

 <?php
// ... Image generation goes here
header("Content-Type: image/jpeg"); 
$filename = 'img/' . md5(microtime()) . '.jpg'// Microtime is just as an example, you should use your own method.
$fp = fopen($filename, "x"); //Creating and opening the file for write-only  
$im->writeImageFile($fp); //Writing the image to the file pointer (I would recommend writing it using, fwrite(), because it is binary-safe writing method)
fclose($fp);
?>

// Html
<img src="<?php print $filename; ?>" alt="image" title="IMagick Generated Image" />
  

документация для Imagick::writeImageFile

Ответ №6:

В моем случае я нашел решение, подобное этому:

             $im = new Imagick("http://www.yourserver.com/upload/file_name.pdf");
            $im->setResolution(300, 300);     // if higher image will be good to read
            $im->setIteratorIndex(0); // read first page
            $im->setImageFormat('jpg');
            header('Content-Type: image/jpeg');

            ob_start();
            print $im->getImageBlob(); 
            $contents =  ob_get_contents();
            ob_end_clean();

            echo "<img src='data:image/jpg;base64,".base64_encode($contents)."' />"; //output as image
  

удачи.

Ответ №7:

Единственным решением было бы преобразовать ваше изображение в base64 и включить его в качестве встроенного изображения base64 ( data:image/png;base64, ). Дополнительная ссылка.

Но это не поддерживается в IE 6 и 7.