如何使用 PEL 将 EXIF 信息从一个文件复制到另一个文件?
How to copy EXIF information from one file to another using 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
有什么解决办法吗?
仔细看看你在这里做什么:
$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);
您正在创建一个名为 $jpeg
的新图像并将 EXIF 数据应用到它,但是您正在输出 $new_image
和 ImageJPEG()
。您需要调用 PelJpeg::saveFile()
来保存所做的更改,然后提供该文件。
好的,明白了,这是最终的工作代码:
$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();
我有一个脚本可以为我的摄影博客网站中的一些图片添加水印。带水印的文件被提供给浏览器并保持原始文件不变。这部分工作正常。
最近我发现简单地使用 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
有什么解决办法吗?
仔细看看你在这里做什么:
$jpeg = new PelJpeg($new_image);
$jpeg->setExif($exif);
header("Content-Type: image/jpeg");
ImageJPEG($new_image);
您正在创建一个名为 $jpeg
的新图像并将 EXIF 数据应用到它,但是您正在输出 $new_image
和 ImageJPEG()
。您需要调用 PelJpeg::saveFile()
来保存所做的更改,然后提供该文件。
好的,明白了,这是最终的工作代码:
$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();