2024年PHP日本大会

iptcparse

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

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

描述

iptcparse(字符串 $iptc_block): 数组|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 条备注

匿名用户
22 年前
补充一下以上回复,他漏掉了一些IPTC标签

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

标题撰写人
$iptc["2#122"][0];

我只是想提醒一下,因为关键词对于数据库应用非常重要。我这些是从Photoshop 6.0文件中提取IPTC标签得到的,所以希望它们是标准化的;)
tomasz at trejderowski dot pl
11 年前
在初始发布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'
);
michael wells
20 年前
要将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是一个巨大的改进!!)。
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。
匿名用户
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>';
}
}
}
}
evan at nospam dot ozhiker dot com
20 年前
您可能已经注意到,Photoshop中的几个元数据字段无法通过IPTC访问。

我编写了一个库“PHP JPEG元数据工具包”,它解决了这个问题,因为它允许读取、写入和解释几乎任何类型的元数据,包括这些缺失的字段。

试试看,并从以下地址下载:
http://www.ozhiker.com/electronics/pjmt/index.html
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]; }}
Scin
22 年前
如果您不确定在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";
}
}
oli4 at gmx dot li
7年前
有没有办法按关键词排序???
谢谢帮助

<?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