【问题标题】:Add copyright string to JPEG using ImageMagick/Imagick in PHP?在 PHP 中使用 ImageMagick/Imagick 将版权字符串添加到 JPEG?
【发布时间】:2026-01-17 04:05:01
【问题描述】:

我正在尝试删除现有的 EXIF 标签,然后使用以下基本代码应用版权字符串:

$im = new Imagick($file);
$im->stripImage();

// Embed new EXIF data
$im->setImageProperty('EXIF:ImageDescription', $copy_string);
$im->setImageProperty('EXIF:Copyright', $copy_string);
//$im->setImageProperty('Exif:ImageDescription', $copy_string);
//$im->setImageProperty('Exif:Copyright', $copy_string);
//$im->setImageProperty('ImageDescription', $copy_string);
//$im->setImageProperty('Copyright', $copy_string);

$im->writeImage($file);
$im->clear();
$im->destroy();

我无法找到示例用法。该手册有 CLI 属性字符串 here。 “嵌入”下的所有行都没有任何效果。对于这个解决方案,我们将继续使用 Imagick。谢谢。

【问题讨论】:

  • 你试过Exif:Copyright吗?就像文档中的那样(不是全部大写)。
  • @CharlotteDunois 刚刚尝试过。不去。无论如何,谢谢。
  • 我不相信 IM 可以写入 EXIF 个人资料信息。
  • emcconville 是正确的 github.com/ImageMagick/ImageMagick/issues/… “Exif 值不会持久化。我们只读取它们,您可以‘更改’它们,但我们不会在保存文件时更新 exif 配置文件。” - 任何人都可以通过点击“编辑”按钮在手册中记录这一点。
  • @Danack 好的,现在我可以离开 Imagick,因为它已被解释为无法保存 Exif 数据。谢谢你。

标签: php imagemagick imagick exif


【解决方案1】:

如前所述,Imagemagick 不允许您写入 EXIF 数据,因此没有 “正确” 答案。您可能会也可能不喜欢我提到的here 作为解决方法的想法。本质上,您可以为要放入图像中的 EXIF 数据创建一个一次性图像作为 “模板”(我稍后会解释如何),然后将其用作您的实际图像并将图像数据与正确的 EXIF 数据合成在图像之上,正如 Danack 所说,ImageMagick 将保留 EXIF 数据。

所以,具体来说:

   // Open the copyright image with the correct EXIF data
   $cr = new Imagick('copyright.jpg');

   // Open the image to alter and get its size
   $file = 'test.jpg';
   $im = new Imagick($file);
   $d = $im->getImageGeometry(); 
   $w = $d['width']; 
   $h = $d['height']; 

   // Resize the copyright and composite the image over the top
   $cr->resizeImage($w,$h,imagick::FILTER_POINT,0,0);
   $cr->compositeImage($im,imagick::COMPOSITE_SRCOVER ,0,0);
   $cr->writeImage($file);

所以,我使用我想要的 EXIF 数据作为一次性操作制作了版权图像 - 尽管使用了 exiftool 但您只需要创建一次该图像 - 您不需要继续使用 exiftool 或将其作为工具链的一部分,您只需保留它生成的模板:

# Make template copyright file
convert -size 1x1 xc:black copyright.jpg

# Put some EXIOF data in the template
exiftool -copyright="2015 Copyright Captain Hackalot" copyright.jpg

【讨论】:

  • 我试了一下,它部分工作。使用带有所需版权信息的非常小的 1x1 jpeg 图像,这个“copyright.jpg”图像的大小约为 3k,这很好。当我使用上面的代码时,写入的文件要大得多。 (例如,164kB --> 192kB、26kB --> 49kB)。如何以最小的文件大小增加(对于元数据)添加 Exif 数据,而不更改压缩或过滤器?
  • 尝试getImageCompressionQuality()的源图像,然后使用setImageCompressionQuality()为输出图像设置相同的质量