2015-11-16 4 views
0

У меня есть сценарий, который добавляет водяной знак к некоторым фотографиям на моем фотографическом веб-сайте блога. Файл с водяными знаками подается в браузер и оставляет исходный нетронутый. Эта часть работает нормально.Как скопировать информацию 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.

[EDIT] Ok, удалось сделать эту работу так:

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

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

$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($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

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

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

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

+0

Привет, спасибо за помощь. Но есть ошибка до: Обрезаемая фатальная ошибка: аргумент 1 передан lsolesen \ pel \ PelJpeg :: setExif() должен быть экземпляром lsolesen \ pel \ PelExif, экземпляр lsolesen \ pel \ PelIfd, указанный в/var/www/html/clerigo/exif.php в строке 71 и определен в /var/www/html/clerigo/pel/src/PelJpeg.php в строке 304. Можете ли вы помочь мне разобраться в этом? – jaclerigo