我正在尝试创建一个网站,我可以在JPEG文件中添加和修改元数据.
有没有办法可以用相当简单的方式写出exif数据.
我看到一两个例子,但是他们太复杂了,不能在给定的时间内掌握.
我知道IPTC,我知道元数据可以添加到JPEG文件.但是,这样做的正确方法是什么呢?
如果有人可以提供一些帮助,如何使用EXIF或IPTC或任何其他图书馆或PHP功能添加元数据到JPEG,那么我将非常感激.
更新:
首先感谢dbers的回复.
我看过代码.我设法将其添加到JPG中的默认标签.
对于代码的一小部分意味着什么,我仍然有点困惑.
例如在PHP函数中编写exif数据:
function iptc_make_tag($rec,$data,$value)
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);
...
}
我没有碰到一个函数变量,如果没有定义,$rec,$data和$value被引用.还是从iptc_make_tag获取?
我回应了$rec和$value,但是我没有在屏幕上返回一个值.
if(isset($info['APP13']))
我不知道APP13是什么意思,当我尝试回显出$info时,当我在一个表中回显出$info时,我就会得到以下结果.
'2#120' => 'Test image','2#116' => 'copyright 2008-2009,The PHP Group'
我知道你找到了解决方案,但这可能会帮助任何人寻找同样的事情!
我修改了一个我发现here的课(感谢debers).
并且所有对IPTC标签的引用都可以从PDF中读取
现在的代码(PHP> = 5.4):
<?
define("IPTC_OBJECT_NAME","005");
define("IPTC_EDIT_STATUS","007");
define("IPTC_PRIORITY","010");
define("IPTC_CATEGORY","015");
define("IPTC_SUPPLEMENTAL_CATEGORY","020");
define("IPTC_FIXTURE_IDENTIFIER","022");
define("IPTC_KEYWORDS","025");
define("IPTC_RELEASE_DATE","030");
define("IPTC_RELEASE_TIME","035");
define("IPTC_SPECIAL_INSTRUCTIONS","040");
define("IPTC_REFERENCE_SERVICE","045");
define("IPTC_REFERENCE_DATE","047");
define("IPTC_REFERENCE_NUMBER","050");
define("IPTC_CREATED_DATE","055");
define("IPTC_CREATED_TIME","060");
define("IPTC_ORIGINATING_PROGRAM","065");
define("IPTC_PROGRAM_VERSION","070");
define("IPTC_OBJECT_CYCLE","075");
define("IPTC_BYLINE","080");
define("IPTC_BYLINE_TITLE","085");
define("IPTC_CITY","090");
define("IPTC_PROVINCE_STATE","095");
define("IPTC_COUNTRY_CODE","100");
define("IPTC_COUNTRY","101");
define("IPTC_ORIGINAL_TRANSMISSION_REFERENCE","103");
define("IPTC_HEADLINE","105");
define("IPTC_CREDIT","110");
define("IPTC_SOURCE","115");
define("IPTC_copYRIGHT_STRING","116");
define("IPTC_CAPTION","120");
define("IPTC_LOCAL_CAPTION","121");
class IPTC
{
var $Meta = [];
var $file = null;
function __construct($filename)
{
$info = null;
$size = getimagesize($filename,$info);
if(isset($info["APP13"])) $this->Meta = iptcparse($info["APP13"]);
$this->file = $filename;
}
function getValue($tag)
{
return isset($this->Meta["2#$tag"]) ? $this->Meta["2#$tag"][0] : "";
}
function setValue($tag,$data)
{
$this->Meta["2#$tag"] = [$data];
$this->write();
}
private function write()
{
$mode = 0;
$content = iptcembed($this->binary(),$this->file,$mode);
$filename = $this->file;
if(file_exists($this->file)) unlink($this->file);
$fp = fopen($this->file,"w");
fwrite($fp,$content);
fclose($fp);
}
private function binary()
{
$data = "";
foreach(array_keys($this->Meta) as $key)
{
$tag = str_replace("2#","",$key);
$data .= $this->iptc_maketag(2,$tag,$this->Meta[$key][0]);
}
return $data;
}
function iptc_maketag($rec,$value)
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);
if($length < 0x8000)
{
$retval .= chr($length >> 8) . chr($length & 0xFF);
}
else
{
$retval .= chr(0x80) .
chr(0x04) .
chr(($length >> 24) & 0xFF) .
chr(($length >> 16) & 0xFF) .
chr(($length >> 8) & 0xFF) .
chr($length & 0xFF);
}
return $retval . $value;
}
function dump()
{
echo "<pre>";
print_r($this->Meta);
echo "</pre>";
}
#requires GD library installed
function removeAllTags()
{
$this->Meta = [];
$img = imagecreatefromstring(implode(file($this->file)));
if(file_exists($this->file)) unlink($this->file);
imagejpeg($img,100);
}
}
$file = "photo.jpg";
$objIPTC = new IPTC($file);
//set title
$objIPTC->setValue(IPTC_HEADLINE,"A title for this picture");
//set description
$objIPTC->setValue(IPTC_CAPTION,"Some words describing what can be seen in this picture.");
echo $objIPTC->getValue(IPTC_HEADLINE);
?>