загрузить изображение с помощью imagick в php

#php #image-processing #imagick

#php #обработка изображений #imagick

Вопрос:

я попытался применить водяной знак к изображению с помощью imagick, но не смог загрузить изображение с помощью imagick

это то, что я пытаюсь

 <?php
// Open the original image
$image = new Imagick();
$image->readImage("lion.jpg");

// Open the watermark
$watermark = new Imagick();
$watermark->readImage("1.png");

// Overlay the watermark on the original image
$image->compositeImage($watermark, imagick::COMPOSITE_OVER, 0, 0);

// send the result to the browser
header("Content-Type: image/" . $image->getImageFormat());
echo $image;

?>
  

когда я запускаю этот код, я получаю эту ошибку

 Fatal error: Uncaught exception 'ImagickException' with message 'unable to open image `lion.jpg': No such file or directory @ error/blob.c/OpenBlob/2617' in C:xampphtdocsimagick.php:4 Stack trace: #0 C:xampphtdocsimagick.php(4): Imagick->readimage('lion.jpg') #1 {main} thrown in C:xampphtdocsimagick.php on line 4
  

и код, и изображения находятся в одном каталоге

и я использую ImageMagick 6.7.7-4 2012-05-29 Q16 в Windows

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

1. Вы убедились, что разрешения для файла позволяют php читать этот файл?

2. да, я использую это изображение с помощью gd несколько раз через php

3. Вы проверили, правильный ли у вас путь к файлам? тестовый файл_существует («lion.jpg «) и смотрите, что вы получите. или is_readable()

4. file_exists(«lion.jpg «); и is_readable() оба возвращают 1

5. Что произойдет, если вы передадите абсолютный путь? $image->readImage(реальный путь(«lion.jpg «));

Ответ №1:

 try this 

<?php
// Open the original image
$image = new Imagick();
$image->readImage("C:/xampp/htdocs/projectname/lion.jpg");

// Open the watermark
$watermark = new Imagick();
$watermark->readImage("C:/xampp/htdocs/projectname/1.png");

// Overlay the watermark on the original image
$image->compositeImage($watermark, imagick::COMPOSITE_OVER, 0, 0);

// send the result to the browser
header("Content-Type: image/" . $image->getImageFormat());
echo $image;

?>
  

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

1. да, спасибо за эту работу, но я думаю, что это неправильный способ сделать

Ответ №2:

Вы должны использовать Imagick::mergeImageLayers() так:

 $img1 = new Imagick(realpath('lion.jpg'));
$img2 = new Imagick(realpath('1.png'));

// in case you need to add opacity...
$img2->setImageOpacity(.5);// between 0.0 and 1.0

$img2->setImagePage($img2->getImageWidth(), $img2->getImageHeight(), 0, 0);
$img1->addImage($img2);

$result = $img1->mergeImageLayers(Imagick::LAYERMETHOD_COMPOSITE);
$format = 'jpg';
$result->setImageFormat($format);

header('Content-Type: image/'.$format);
echo $result->getImageBlob();
  

Для упрощения предполагается, что изображения имеют одинаковую ширину