我正在尝试创建一个网站,我可以在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);
?>

在php中编写exif数据的更多相关文章

  1. ios – Swift:自定义相机使用图像保存修改后的元数据

    我试图保存图像样本缓冲区中的一些元数据以及图像.我需要:>将图像旋转到元数据的方向>从元数据中删除方向>将日期保存到元数据中>将包含元数据的图像保存到文档目录我试过从数据创建一个UIImage,但是删除了元数据.我已经尝试使用数据中的CIImage来保存元数据,但是我无法将其旋转然后将其保存到文件中.这是我保存图像的代码.解决方法我最终弄清楚如何让一切按照我需要的方式工作.对我帮助最大的事情是发现

  2. ios – 如何为多个目标提供传送(fastlane)下载元数据?

    附:这是一个很大的遗留项目,所以将它分成六个不同的项目会很棒,但不幸的是,这不是一个选择.解决方法我一直在努力解决这个问题,使用.env文件设置提交很容易.但是检索初始数据很困难,但并非不可能.要获取元数据,它运行此命令:并为截图:

  3. ios – 从MPMoviePlayerController获取MetaData

    代码!

  4. ios – 从音频流中获取元数据

    我想获取文件名,如果可能的话,可以从我在AVQueuePlayer上播放的AVPlayerItem中的流式URL中的相册图像,但是我不知道该怎么做.另外如果事实证明,我的流网址没有任何元数据,我可以将元数据放入我的NSURL*,然后传递给AVPlayerItem?

  5. 在iOS上保存修改后的元数据(无需重新编码)的原始图像数据

    我想在temp文件夹中保存一些元数据更改的图像,而无需重新编码实际的图像数据.我发现能够做到这一点的唯一方法是ALAssetsLibrary/writeImageDataToSavedPhotosAlbum:metadata:completionBlock:,但是,这个方法将图像保存到照片库中.相反,我想将图像保存到临时文件夹(例如,通过电子邮件分享,而不填充照片库).我试过使用CGImageDe

  6. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  7. iOS应用程序审核队列,如果您更改元数据,是否重置?

    我知道更新并重新提交您的应用程序二进制文件让您回到iOS应用程序市场审核队列,并将时钟重新设置为6–8天的等待时间...但有人知道如果更改元数据也会使您处于队列的后面?我的第一个二进制文件在5天内被批准和发布(是),但是我提交的更新已经在那里等待10天了...也许是因为我已经添加了一些描述翻译,并更改了截图?

  8. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  9. OpenStack 对象存储 Swift 简单介绍

    Swift最适合的就是永久类型的静态数据的长期存储。提供账号验证的节点被称为AccountServer。Swift中由Swauth提供账号权限认证服务。ProxyserveracceptsincomingrequestsviatheOpenStackObjectAPIorjustrawHTTP.Itacceptsfilestoupload,modificationstoMetadataorcontainercreation.Inaddition,itwillalsoservefilesorcontaine

  10. swift对象存储

    Swift最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一,为其Nova子项目提供虚机镜像存储服务。Swift为账户,容器和对象分别定义了的环,查找账户和容器的是同样的过程。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部