PHP Conference Japan 2024

iptcparse

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

iptcparse將二進位 IPTC 區塊解析為單個標籤

說明

iptcparse(字串 $iptc_block): 陣列|false

» IPTC 區塊解析為單個標籤。

參數

iptc_block

二進位 IPTC 區塊。

傳回值

傳回一個陣列,使用標籤標記作為索引,值作為值。如果發生錯誤或找不到 IPTC 資料,則傳回 false

範例

範例 #1:getimagesize() 搭配 iptcparse() 使用

<?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 年前
我設法更新了 "pkrohn at daemonize dot com" 的陣列,距離最初發布已經過了 12 年。

如果您想將一些 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', // OTR (On-The-Record)
'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) 來存取結尾引號字元。這會在網頁瀏覽器或 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 Metadata Toolkit」,它可以解決這個問題,因為它允許讀取、寫入和解讀幾乎任何類型的詮釋資料,包括這些遺漏的欄位。

試用並下載它:
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 區塊的特定值儲存在哪裡,只需透過 foreach 迴圈執行區塊即可找出。

(在第一個 echo 的開頭插入一個新的段落)

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

foreach($iptc as $key => $value)
{
echo "<b>IPTC 鍵值:</b> $key <b>內容:</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