【问题标题】:Read image IPTC data读取图像 IPTC 数据
【发布时间】:2019-07-26 04:44:57
【问题描述】:

我在读取某些图像的 IPTC 数据时遇到了一些问题,我之所以要这样做,是因为我的客户已经在 IPTC 数据中拥有所有关键字,并且不想重新输入他们在网站上。

所以我创建了这个简单的脚本来读出它们:

$size = getimagesize($image, $info);

if(isset($info['APP13'])) {
    $iptc = iptcparse($info['APP13']);

    print '<pre>';
        var_dump($iptc['2#025']);
    print '</pre>';
}

这在大多数情况下都能完美运行,但在处理某些图像时会遇到问题。

注意:未定义索引:2#025

虽然我可以清楚地看到photoshop中的关键字。

有没有像样的小型库可以读取每张图片中的关键字?还是我在这里做错了什么?

【问题讨论】:

  • 我注意到这只发生在 Photoshop CS3 中保存的图像

标签: image exif iptc


【解决方案1】:

我见过很多奇怪的 IPTC 问题。可能是您有 2 个 APP13 段。我注意到,由于某些原因,一些 JPEG 有多个 IPTC 块。这可能是使用多个照片编辑程序或一些手动文件操作的问题。

可能是 PHP 试图读取空的 APP13 甚至嵌入的“缩略图元数据”。

段长度也可能存在问题 - APP13 或 8BIM 具有可能具有错误值的长度标记字节。

尝试 HEX 编辑器并“手动”检查文件。

【讨论】:

    【解决方案2】:

    我发现 IPTC 几乎总是使用 XMP 格式嵌入为 xml,并且通常不在 APP13 插槽中。您有时可以使用iptcparse($info['APP1']) 获取 IPTC 信息,但在没有第三方库的情况下获取它的最可靠方法是简单地从相关 xml 字符串中搜索图像文件(我从另一个答案中得到了这个,但我没有'找不到它,否则我会链接!):

    关键字的 xml 格式始终为 "&lt;dc:subject&gt;...&lt;rdf:Seq&gt;&lt;rdf:li&gt;Keyword 1&lt;/rdf:li&gt;&lt;rdf:li&gt;Keyword 2&lt;/rdf:li&gt;...&lt;rdf:li&gt;Keyword N&lt;/rdf:li&gt;&lt;/rdf:Seq&gt;...&lt;/dc:subject&gt;"

    因此,您可以使用file_get_contents(get_attached_file($attachment_id)) 将文件作为字符串获取,使用strpos() 查找每个开始(&lt;rdf:li&gt;) 和结束(&lt;/rdf:li&gt;) XML 标记,并使用@987654328 获取它们之间的关键字@。

    以下 sn-p 适用于我测试过的所有 jpeg。它将使用从 wordpress 上 ID 为 $attachment_id 的图像中获取的 IPTC 标签填充数组 $keys

    $content = file_get_contents(get_attached_file($attachment_id));
    
    // Look for xmp data: xml tag "dc:subject" is where keywords are stored
    $xmp_data_start = strpos($content, '<dc:subject>') + 12;
    
    // Only proceed if able to find dc:subject tag
    if ($xmp_data_start != FALSE) {
        $xmp_data_end   = strpos($content, '</dc:subject>');
        $xmp_data_length     = $xmp_data_end - $xmp_data_start;
        $xmp_data       = substr($content, $xmp_data_start, $xmp_data_length);
    
        // Look for tag "rdf:Seq" where individual keywords are listed
        $key_data_start = strpos($xmp_data, '<rdf:Seq>') + 9;
    
        // Only proceed if able to find rdf:Seq tag
        if ($key_data_start != FALSE) {
            $key_data_end   = strpos($xmp_data, '</rdf:Seq>');
            $key_data_length     = $key_data_end - $key_data_start;
            $key_data       = substr($xmp_data, $key_data_start, $key_data_length);
    
            // $ctr will track position of each <rdf:li> tag, starting with first
            $ctr = strpos($key_data, '<rdf:li>');
    
            // Initialize empty array to store keywords
            $keys = Array();
    
            // While loop stores each keyword and searches for next xml keyword tag
            while($ctr != FALSE && $ctr < $key_data_length) {
                // Skip past the tag to get the keyword itself
                $key_begin = $ctr + 8;
    
                // Keyword ends where closing tag begins
                $key_end = strpos($key_data, '</rdf:li>', $key_begin);
    
                // Make sure keyword has a closing tag
                if ($key_end == FALSE) break;
    
                // Make sure keyword is not too long (not sure what WP can handle)
                $key_length = $key_end - $key_begin;
                $key_length = (100 < $key_length ? 100 : $key_length);
    
                // Add keyword to keyword array
                array_push($keys, substr($key_data, $key_begin, $key_length));
    
                // Find next keyword open tag
                $ctr = strpos($key_data, '<rdf:li>', $key_end);
            }
        }
    } 
    

    我在插件中实现了这个功能,将 IPTC 关键字放入 WP 的“描述”字段which you can find here

    【讨论】:

      【解决方案3】:

      ExifTool 是非常健壮的,如果你能做到这一点(从 PHP 看起来像?)

      【讨论】:

      • 谢谢,但很遗憾我无法在当前主机上运行 shell 命令。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2020-09-06
      • 2018-10-31
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多