image - 读取图像 IPTC 数据

标签 image exif iptc

我在读取某些图像的 IPTC 数据时遇到了一些麻烦,我之所以要这样做,是因为我的客户在 IPTC 数据中已经有了所有关键字,并且不想在地点。

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

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

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

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

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

Notice: Undefined index: 2#025



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

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

最佳答案

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

关键字的 xml 格式始终为 "<dc:subject>...<rdf:Seq><rdf:li>Keyword 1</rdf:li><rdf:li>Keyword 2</rdf:li>...<rdf:li>Keyword N</rdf:li></rdf:Seq>...</dc:subject>"
因此,您可以使用 file_get_contents(get_attached_file($attachment_id)) 将文件作为字符串获取, 使用 strpos()找到每个开始( <rdf:li> )和结束( </rdf:li> )XML 标记,并使用 substr() 获取它们之间的关键字.

以下代码段适用于我测试过的所有 jpeg。它将填充数组 $keys带有从 wordpress 图像中提取的 IPTC 标签,ID $attachment_id :

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

关于image - 读取图像 IPTC 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778505/

相关文章:

objective-c - ios 将地理标记写入图像

python - 在Python中删除EXIF数据?

python - 当不存在此类数据时,是否可以使用 python 将 IPTC 数据添加到 JPG?

java - BufferedImage 超出范围

带有标签的 Javascript/HTML5 图像查看器

exif - 是什么导致某些 EXIF 标签不可写?

php - 如何将 IPTC 数据从一张图像复制到另一张图像?

ruby-on-rails - 用于从 JPEG 中提取 IPTC 数据的 Ruby gem

JavaScript 和图像映射?这是如何运作的?

c# - 从 C# 中的一系列图像生成视频