我在读取一些图片的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中的关键词。
是否有任何合适的小型库可以读取每个图像中的关键字?还是我在这里做错了什么?
发布于 2012-04-20 08:05:29
我见过很多奇怪的IPTC问题。可能是你有两个APP13段。我注意到,出于某些原因,一些JPEG有多个IPTC块。这可能是使用几个照片编辑程序或一些手动文件操作的问题。
可能是PHP试图读取空的APP13,甚至是嵌入的“缩略图元数据”。
APP13或8 8BIM的长度标记字节可能有错误的值,也可能出现问题。
尝试HEX编辑器并检查文件“手动”。
发布于 2019-07-25 20:44:57
我发现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()在它们之间获取关键字。
下面的代码片段适用于我测试过的所有jpegs。它将在数组$keys中填充IPTC标记,这些标签来自于id $attachment_id在wordpress上的图像。
$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的"Description“字段,你可以在这里找到中。
发布于 2012-01-19 03:00:43
ExifTool是非常健壮的,如果您可以对它进行打包(从PHP看来是这样的?)
https://stackoverflow.com/questions/8778505
复制相似问题