2015-08-19 2 views
0

Я использую phalcon php framework. У меня есть блог в моем приложении, где пользователь может отправить изображение, прикрепленное к его сообщению в блоге, и оно отображается при просмотре сообщения. Я хочу отобразить это изображение на индексной странице блога, где перечислены все сообщения, однако я хочу, чтобы это уменьшилось, чтобы уменьшить его размер. Я смог использовать imagick для сохранения эскиза в каталоге и загрузки эскиза оттуда, однако мне нужно избегать сохранения миниатюры и генерировать эскизы каждый раз только для их отображения. Вот код, который я использовал для создания изображения с ImagickКак отобразить изображение, созданное imagick php в html-представлении?

public function thumbnail($img) 
    { 
     $maxsize = 100; 
     $image = new Imagick($img); 
     // Resizes to whichever is larger, width or height 
     if($image->getImageHeight() <= $image->getImageWidth()) 
     { 
      $image->resizeImage($maxsize,0,Imagick::FILTER_LANCZOS,1); 
     } 
     else 
     { 
      $image->resizeImage(0,$maxsize,Imagick::FILTER_LANCZOS,1); 
     } 

     // Set to use jpeg compression 
     $image->setImageCompression(Imagick::COMPRESSION_JPEG); 
     // Set compression level (1 lowest quality, 100 highest quality) 
     $image->setImageCompressionQuality(75); 
     // Strip out unneeded meta data 
     $image->stripImage(); 
     // Writes resultant image to output directory 
     $image->writeImage($uploaddir.'/thumbs/'. basename($_FILES['photo']['name'])); 
      // Destroys Imagick object, freeing allocated resources in the process 
     $image->destroy(); 
    } 

Я попытался удалить только две последние строки, где сохранено изображение, а затем объект Imagick разрушается, но не может продолжаться, чтобы отобразить изображение в индексном представлении.

ответ

0

Этап 1 - Используйте буфер обмена. Шаг 2 - Отсоедините уже сохраненное изображение после получения кода base64.

Для примера рассмотрим следующий фрагмент кода:

$im = new Imagick(); 
$im->setResolution(300,300); 
$im->readimage('path_to_the_file.pdf'); 
$im->setImageFormat('jpeg'); 
$im->writeImages('file_name_to_save.jpg', false); 
$im->clear(); 
$im->destroy(); 

$dest = imagecreatefromjpeg ('file_name_to_save.jpg'); 

//Step 1 
ob_start(); 
imagejpeg($dest); 
$image_data = ob_get_clean(); 
imagedestroy($dest); 
$img_source = base64_encode($image_data); 

//Step 2 
unlink('file_name_to_save.jpg'); 

Теперь в переменной $ img_source у вас есть base64 изображения, которое вы можете использовать его как это:

'<img src="data:image/jpg;base64,'.$img_source.'" style="max-width: 100%; max-height:100%;" />'; 
+0

Кажется довольно глупо использовать здесь 'imagecreatefromjpeg' и' imagejpeg'. Вы уже _got_ данные, сохраненные в файле с именем 'file_name_to_save.jpg', так почему бы просто не прочитать его оттуда? И даже это, вероятно, не нужно - «Imagick :: __ toString» существует. – CBroe

0

Я используя что-то похожее на это:

public function thumbAction() { 
    // Generate thumb from image & save it on disk 
    $image = $this->thumbnail(); // well can be anything that return Imagick 
    $this->response->setHeader('Content-Type', 'image/jpg'); 
    echo $image; 
} 

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

Также я сохраняю изображение на некотором пути, например thumbs/a/image.jpg. Я настроил nginx для проверки существующего файла, и если файл не существует, он вызывает скрипт Phalcon. В приложении Phalcon у меня есть маршрут, который указывает на любой путь /thumbs* к вышеуказанному действию. При первом вызове изображение сохраняется на пути thumbs/a/, поэтому на следующем вызове сервер Nginx возвращает это изображение вместо вызова PHP.