We create thumb images on our server and I'm looking for a way to save metadata (text) in that image. Is that possible?
我们在服务器上创建拇指图像,我正在寻找一种在该图像中保存元数据(文本)的方法。那可能吗?
At this moment we use PHP
and we create JPG
images.
此时我们使用PHP并创建JPG图像。
5 个解决方案
#1
3
You question is the same as writing exif data in php.
你的问题与在php中编写exif数据相同。
My answer is:
我的回答是:
- PEL(PHP Exif Library). A library for reading and writing Exif headers in JPEG and TIFF images using PHP.
- The PHP JPEG Metadata Toolkit. Allows reading, writing and display of the following JPEG metadata formats: EXIF 2.2, XMP / RDF, IPTC-NAA IIM 4.1 ect
- ExifTool by perl. The ExifTool is excellent. It’s basically got it all – EXIF, IPTC and XMP support (read/write) and support for manufacturer extensions.
PEL(PHP Exif库)。使用PHP读取和编写JPEG和TIFF图像的Exif标头的库。
PHP JPEG元数据工具包。允许读取,写入和显示以下JPEG元数据格式:EXIF 2.2,XMP / RDF,IPTC-NAA IIM 4.1等
Perl的ExifTool。 ExifTool非常棒。它基本上是全部 - EXIF,IPTC和XMP支持(读/写)和对制造商扩展的支持。
#2
2
I hope this helps you!
我希望这可以帮助你!
I modified a class that I found here (thanks debers).
我修改了一个我在这里找到的课程(感谢debers)。
And all the references to IPTC tags can be readed from this PDF
所有对IPTC标签的引用都可以从这个PDF中获取
Code (PHP >= 5.4):
代码(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);
?>
#4
1
Yes, it's possible.
是的,这是可能的。
You can use the almighty Exiftool perl utility, which handles nearly every known set of tags, both standard(EXIF, IPTC, Adobe's XMP, etc) and proprietary ones.
您可以使用全能的Exiftool perl实用程序,它可以处理几乎所有已知的标记集,包括标准(EXIF,IPTC,Adobe的XMP等)和专有标记。
#1
3
You question is the same as writing exif data in php.
你的问题与在php中编写exif数据相同。
My answer is:
我的回答是:
- PEL(PHP Exif Library). A library for reading and writing Exif headers in JPEG and TIFF images using PHP.
- The PHP JPEG Metadata Toolkit. Allows reading, writing and display of the following JPEG metadata formats: EXIF 2.2, XMP / RDF, IPTC-NAA IIM 4.1 ect
- ExifTool by perl. The ExifTool is excellent. It’s basically got it all – EXIF, IPTC and XMP support (read/write) and support for manufacturer extensions.
PEL(PHP Exif库)。使用PHP读取和编写JPEG和TIFF图像的Exif标头的库。
PHP JPEG元数据工具包。允许读取,写入和显示以下JPEG元数据格式:EXIF 2.2,XMP / RDF,IPTC-NAA IIM 4.1等
Perl的ExifTool。 ExifTool非常棒。它基本上是全部 - EXIF,IPTC和XMP支持(读/写)和对制造商扩展的支持。
#2
2
I hope this helps you!
我希望这可以帮助你!
I modified a class that I found here (thanks debers).
我修改了一个我在这里找到的课程(感谢debers)。
And all the references to IPTC tags can be readed from this PDF
所有对IPTC标签的引用都可以从这个PDF中获取
Code (PHP >= 5.4):
代码(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);
?>
#3
#4
1
Yes, it's possible.
是的,这是可能的。
You can use the almighty Exiftool perl utility, which handles nearly every known set of tags, both standard(EXIF, IPTC, Adobe's XMP, etc) and proprietary ones.
您可以使用全能的Exiftool perl实用程序,它可以处理几乎所有已知的标记集,包括标准(EXIF,IPTC,Adobe的XMP等)和专有标记。