Как скопировать информацию EXIF ​​из одного файла в другой, используя PEL?

У меня есть скрипт, который добавляет водяной знак к некоторым фотографиям на моем веб-сайте фотографического блога. Файл с водяными знаками подается в браузер и оставляет оригинал нетронутым. Эта часть работает нормально.

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

Я смог выяснить, как установить PEL, но не смог получить его для копирования данных EXIF ​​из $original_image в $new_image,

$jpeg = new PelJpeg($original_image);
$exif = $jpeg->getExif();
$tiff = $exif->getTiff();
$ifd0 = $tiff->getIfd();
$exif = $ifd0->getSubIfd(PelIfd::EXIF);
$ifd1 = $ifd0->getNextIfd();

/*
creates copy of $original_image to $new_image, adds watermark to $new_image
*/

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);

Это также производит ошибку как это:

Catchable fatal error: Argument 1 passed to lsolesen\pel\PelJpeg::setExif() must be an instance of lsolesen\pel\PelExif, instance of lsolesen\pel\PelIfd given, called in /var/www/html/clerigo/exif.php on line 71 and defined in /var/www/html/clerigo/pel/src/PelJpeg.php on line 304.

[РЕДАКТИРОВАТЬ]
Хорошо, удалось сделать эту работу так:

$jpeg = new PelJpeg($original);
$exif = $jpeg->getExif();

/*
creates copy of $original_image to $new_image, adds watermark to $new_image
*/

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
ImageJPEG($new_image, "new_image.jpg");
$jpeg->saveFile("/var/www/html/clerigo/new_image.jpg");

Дело в том, что это сохранение изображения в файл, и цель не в том, чтобы сохранить какое-либо изображение, а в том, чтобы предоставить его только браузеру по запросу, например так:

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
$jpeg->saveFile($new_image);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);
imagedestroy($new_image);

Но это приводит к ошибке:
Warning: file_put_contents() expects parameter 1 to be a valid path, resource given in /var/www/html/clerigo/pel/src/PelJpeg.php on line 600

Есть идеи как решить это?

0

Решение

Внимательно посмотрите на то, что вы делаете здесь:

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);

Вы создаете новое изображение под названием $jpeg и применяя к нему данные EXIF, но затем вы выводите $new_image с ImageJPEG(), Вам нужно будет позвонить PelJpeg::saveFile() чтобы сохранить внесенные изменения, а затем подать этот файл.

0

Другие решения

ОК, разобрался, вот окончательный и рабочий код:

$jpeg = new PelJpeg($original_image);
$exif = $jpeg->getExif();

/*
creates copy of $original_image to $new_image, adds watermark to $new_image
*/

$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
echo $jpeg->getBytes();
0

По вопросам рекламы [email protected]