【问题标题】:How to copy EXIF information from one file to another using PEL?如何使用 PEL 将 EXIF 信息从一个文件复制到另一个文件?
【发布时间】:2015-11-16 12:55:20
【问题描述】:

我有一个脚本,可以为我的摄影博客网站中的一些图片添加水印。带水印的文件将提供给浏览器,而原始文件则保持不变。这部分工作正常。

最近我发现,简单地使用 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

有什么办法解决这个问题吗?

【问题讨论】:

    标签: php exif pel


    【解决方案1】:

    仔细看看你在这里做什么:

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

    您正在创建一个名为 $jpeg 的新图像并将 EXIF 数据应用到它,但随后您将输出 $new_imageImageJPEG()。您需要致电 PelJpeg::saveFile() 以保存您所做的更改,然后提供该文件。

    【讨论】:

    • 您好,感谢您的帮助。但是之前有个错误: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 在第 71 行,并在第 304 行的 /var/www/html/clerigo/pel/src/PelJpeg.php 中定义。你能帮我解决这个问题吗?
    【解决方案2】:

    好的,想通了,这是最终的工作代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2023-02-10
      相关资源
      最近更新 更多