lov*_*ost 13 php jpeg exif metadata
我正在尝试创建一个网站,我可以在其中添加和修改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);
...
}
Run Code Online (Sandbox Code Playgroud)
我还没有碰到过的函数变量,如何$rec,$data以及$value如果它们还没有被定义被引用.或者它们是从iptc_make_tag哪里拿走的?
我回应了$rec,$value但我没有在屏幕上得到一个值.
if(isset($info['APP13']))
Run Code Online (Sandbox Code Playgroud)
我不确定APP13是什么意思,当我试图回应时$info,我只是$info在表格中回应时得到以下内容.
'2#120' => 'Test image', '2#116' => 'Copyright 2008-2009, The PHP Group'
Mat*_*epa 14
我知道你找到了解决方案,但这可能会帮助其他人寻找同样的东西!
所有对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, $data, $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, $this->file, 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);
?>
Run Code Online (Sandbox Code Playgroud)
Imagick 确实允许您设置 EXIF 数据,但仅限于内存中的对象,当将文件写入磁盘时,这些数据会被简单地忽略。最流行的解决方案是使用 exiftools 或使用 PHP 库PEL。PEL 的文档很少,而且 API 也不是不言自明。
我在尝试将正确的 EXIF 数据添加到将作为 360 图像上传到 Facebook 的图像时遇到了这个问题,这需要将特定的相机品牌和型号指定为 EXIF。下面的代码将打开一个图像文件,设置其品牌和型号,然后保存回磁盘。如果您想设置其他 EXIF 数据,请在 PEL 文档中提供所有支持的 PelTag 常量的完整列表。
$data = new PelDataWindow(file_get_contents('IMAGE PATH'));
$tiff = null;
$file = null;
// If it is a JPEG-image, check if EXIF-headers exists
if (PelJpeg::isValid($data)) {
$jpeg = $file = new PelJpeg();
$jpeg->load($data);
$exif = $jpeg->getExif();
// If no EXIF in image, create it
if($exif == null) {
$exif = new PelExif();
$jpeg->setExif($exif);
$tiff = new PelTiff();
$exif->setTiff($tiff);
}
else {
$tiff = $exif->getTiff();
}
}
// If it is a TIFF EXIF-headers will always be set
elseif (PelTiff::isValid($data)) {
$tiff = $file = new PelTiff();
$tiff->load($data);
}
else {
throw new \Exception('Invalid image format');
}
// Get the first Ifd, where most common EXIF-tags reside
$ifd0 = $tiff->getIfd();
// If no Ifd info found, create it
if($ifd0 == null) {
$ifd0 = new PelIfd(PelIfd::IFD0);
$tiff->setIfd($ifd0);
}
// See if the MAKE-tag already exists in Ifd
$make = $ifd0->getEntry(PelTag::MAKE);
// Create MAKE-tag if not found, otherwise just change the value
if($make == null) {
$make = new PelEntryAscii(PelTag::MAKE, 'RICOH');
$ifd0->addEntry($make);
}
else {
$make->setValue('RICOH');
}
// See if the MODEL-tag already exists in Ifd
$model = $ifd0->getEntry(PelTag::MODEL);
// Create MODEL-tag if not found, otherwise just change the value
if($model == null) {
$model = new PelEntryAscii(PelTag::MODEL, 'RICOH THETA S');
$ifd0->addEntry($model);
}
else {
$model->setValue('RICOH THETA S');
}
// Save to disk
$file->saveFile('IMAGE.jpg');
Run Code Online (Sandbox Code Playgroud)
也许你可以尝试:
我自己没有这方面的经验,但是 php 的网站有一些看起来像你正在寻找的东西:
http://php.net/manual/en/function.iptcembed.php
如果这就是您所说的“我见过一两个例子,但它们太复杂,在我给出的时间范围内无法理解”时的意思。
那么你可能会不知所措。
但该页面上的示例看起来并不难掌握。