iptcparse

(PHP 4, PHP 5, PHP 7, PHP 8)

iptcparse将二进制 IPTC 块解析为单个标签

描述

iptcparse(string $iptc_block): array|false

将一个 » IPTC 块解析为其单个标签。

参数

iptc_block

一个二进制 IPTC 块。

返回值

返回一个数组,使用标签标记作为索引,值作为值。如果发生错误或没有找到 IPTC 数据,则返回 false

示例

示例 #1 iptcparse() 与 getimagesize() 一起使用

<?php
$size
= getimagesize('./test.jpg', $info);
if(isset(
$info['APP13']))
{
$iptc = iptcparse($info['APP13']);
var_dump($iptc);
}
?>

注释

注意:

此函数不需要 GD 图像库。

添加注释

用户贡献注释 9 个注释

12
匿名
22 年前
补充上述回复,他漏掉了几个 IPTC 标签

关键字
$iptc["2#025"][n]; (有一个关键字列表)

标题作者
$iptc["2#122"][0];

我只是想指出一下,因为关键字对于数据库应用程序非常重要。我从 Photoshop 6.0 文件中提取了这些 IPTC 标签,因此希望它们是标准化的;)
8
tomasz at trejderowski dot pl
10 年前
我在最初发布 12 年后,成功地更新了 "pkrohn at daemonize dot com" 数组。

如果您想将一些 IPCT 标头字符串更改为更易于理解的内容,请尝试使用类似于此的数组

$iptcHeaderArray = array
(
'2#005'=>'DocumentTitle',
'2#010'=>'Urgency',
'2#015'=>'Category',
'2#020'=>'Subcategories',
'2#040'=>'SpecialInstructions',
'2#055'=>'CreationDate',
'2#080'=>'AuthorByline',
'2#085'=>'AuthorTitle',
'2#090'=>'City',
'2#095'=>'State',
'2#101'=>'Country',
'2#103'=>'OTR',
'2#105'=>'Headline',
'2#110'=>'Source',
'2#115'=>'PhotoSource',
'2#116'=>'Copyright',
'2#120'=>'Caption',
'2#122'=>'CaptionWriter'
);
5
michael wells
19 年前
要将 IPTC 关键字(存储在数组中)导入标量,请尝试这种方法

$keywordcount = count($iptc["2#025"]);
for ($i=0; $i<$keywordcount; $i++) $keywords .= $iptc["2#025"][$i] . " ";

(如果需要,可以删除尾随空格)。

如果您从某些 Mac 应用程序导入数据,它们可能会将 chr(213) 放入字符串中以访问结束引号字符。这在 Web 浏览器或 Windows 上显示为带有波浪号的字母 O。您可以通过以下方式修复此问题

function ConvertChars($in)
{
return str_replace(chr(213),"'",$in);
}

我们在 www.thirdlight.com 解析 IPTC 标签时使用此代码的某些方面。XMP 似乎是目前更好的解决方案(基于 XML 是一个巨大的改进!!)。
6
www.peterdebruin.net
13 年前
如今,IPTC 标题可能使用 UTF-8 编码。
在这种情况下,IPTC 标签 CodedCharacterSet 将被设置为 "ESC % G"。
此标签的标签标记为 "1#090"。
要将此类标题解码为简单的 ISO-8859-1,您可以使用以下代码

<?php
$IPTC_Caption
= "";
$size = getimagesize( $image_path, $info );
if (isset(
$info["APP13"])) {
if(
$iptc = iptcparse( $info["APP13"] ) ) {
$IPTC_Caption = str_replace( "\000", "", $iptc["2#120"][0] );
if(isset(
$iptc["1#090"]) && $iptc["1#090"][0] == "\x1B%G")
$IPTC_Caption = utf8_decode($IPTC_Caption);
}
}
?>

当然,这只会保留 ISO-8859-1 字符。
为了获得正确的 Unicode 支持,您应该将 UTF-8 字节序列转换为 HTML 字符实体,或将整个网页编码为 UTF-8。
4
匿名
20 年前
查看所有可用的 IPCT 数据

function output_iptc_data( $image_path ) {
$size = getimagesize ( $image_path, $info);
if(is_array($info)) {
$iptc = iptcparse($info["APP13"]);
foreach (array_keys($iptc) as $s) {
$c = count ($iptc[$s]);
for ($i=0; $i <$c; $i++)
{
echo $s.' = '.$iptc[$s][$i].'<br>';
}
}
}
}
1
evan at nospam dot ozhiker dot com
20 年前
您可能已经注意到,Photoshop 中的几个元数据字段无法通过 IPTC 获取。

我编写了一个库 "PHP JPEG Metadata Toolkit",它修复了这个问题,因为它允许读取、写入和解释几乎所有类型的元数据,包括这些缺失的字段。

试试看,从以下地址下载
http://www.ozhiker.com/electronics/pjmt/index.html
1
pkrohn at daemonize dot com
23 年前
这花了我比应该花的时间更长才能弄清楚。对于处理一系列照片非常有用,其中您想要的信息在 IPTC 标头中。此示例按引用传递,对于 PHP4 来说,它会向您发出警告。如果您需要写入标头,请查看 Image::IPTCInfo Perl 模块。

$size = GetImageSize ("$image_name",&$info);
$iptc = iptcparse ($info["APP13"]);
if (isset($info["APP13"])) {
$iptc = iptcparse($info["APP13"]){
if (is_array($iptc)) {
$caption = $iptc["2#120"][0];
$graphic_name = $iptc["2#005"][0];
$urgency = $iptc["2#010"][0];
$category = $iptc["2#015"][0];
// 注意,有时 supp_categories 包含多个条目
$supp_categories = $iptc["2#020"][0];
$spec_instr = $iptc["2#040"][0];
$creation_date = $iptc["2#055"][0];
$photog = $iptc["2#080"][0];
$credit_byline_title = $iptc["2#085"][0];
$city = $iptc["2#090"][0];
$state = $iptc["2#095"][0];
$country = $iptc["2#101"][0];
$otr = $iptc["2#103"][0];
$headline = $iptc["2#105"][0];
$source = $iptc["2#110"][0];
$photo_source = $iptc["2#115"][0];
$caption = $iptc["2#120"][0]; }}
0
Scin
21 年前
如果您不确定在 Photoshop 或任何其他软件中输入 IPTC 块的特定值存储在何处,只需遍历该块并找出

(在第一个 echo 的开头插入一个新段落)

$size = GetImageSize ("testimg.jpg", &$info);
$iptc = iptcparse($info["APP13"]);

foreach($iptc as $key => $value)
{
echo "<b>IPTC Key:</b> $key <b>Contents:</b> ";
foreach($value as $innerkey => $innervalue)
{
if( ($innerkey+1) != count($value) )
echo "$innervalue, ";
else
echo "$innervalue";
}
}
-2
oli4 at gmx dot li
6 年前
有没有办法按关键字排序???
谢谢帮忙

<?php
$files
= glob("*.*");
for (
$i=0; $i<count($files); $i++)
{
$image = $files[$i];
$supported_file = array('jpg',);
$ext = strtolower(pathinfo($image, PATHINFO_EXTENSION));

$img = basename($image);
$size = getimagesize($img, $info);
if(isset(
$info['APP13']))
{
$iptc = iptcparse($info['APP13']);
$keyword0 = $iptc["2#025"][0];
if(
$keyword0 == "") {$keyword0 = "";} else {$keyword0 = $keyword0;}
$keywords = $keyword0;
}

if (
in_array($ext, $supported_file)) {
echo
'
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-4 col-xl-3 outerContent" id="theme"><a class="example-image-link" href="'
,$img,'" data-lightbox="example-set" data-title="'.$keywords.'"><div class="innerContent" style="background-image: url(',$img,')"></div></a></div>';
$keywords = "" ;
} else {
continue;
}
}
?>
To Top