在php中写入exif数据

2023-12-07

我正在尝试创建一个网站,可以在其中添加和修改 JPEG 文件中的元数据。

有没有一种方法可以让我以相当简单的方式写入 exif 数据。

我见过一两个例子,但它们太复杂,在我给出的时间范围内无法掌握。

我了解 IPTC 并且我知道可以将元数据添加到 JPEG 文件中。但这样做的正确方法是什么?

如果有人可以提供一些关于如何使用 EXIF 或 IPTC 或 PHP 的任何其他库或功能将元数据添加到 JPEG 的帮助,那么我将非常感激。

Update:

首先感谢版主的回复dbers.

我已经查看了代码。我已经设法让它将默认标签添加到 JPG 中。

我仍然对一小部分代码的含义感到有点困惑。

例如在php函数中写入exif数据:

function iptc_make_tag($rec, $data, $value) 
{ 
    $length = strlen($value); 
    $retval = chr(0x1C) . chr($rec) . chr($data);
    ...
}

我还没有遇到过函数变量,怎么办?$rec, $data and $value如果尚未定义,则将被引用。或者它们是取自iptc_make_tag?

我回声$rec and $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, $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);
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在php中写入exif数据 的相关文章

  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • Laravel Auth:attempt() 不会持久登录

    我在网上找到了许多有类似问题的资源 但似乎没有一个解决方案可以解决我的问题 当我使用以下代码登录用户时 一切看起来都很好 email Input get email password Input get password if Auth a
  • Symfony2:为什么请求传递到受 Symfony2 中 AppCache 影响的 Kernel.Terminate EventListener

    在我的 Symfony2 2 应用程序中 我使用 onKernelTerminate EventListener 以便我可以在渲染响应后进行一些 繁重 处理 以便用户收到更快的响应时间 在我的控制器中 我在请求上设置了一个属性 以便当事件侦
  • 如何让Apache服务index.php而不是index.html?

    如果我将以下行放入index html文件 使 Apache 包含index php file 参观index html页面向我显示了这个 这是为什么 为什么它实际上不包含 PHP 文件 正如其他人指出的那样 您很可能没有 html设置为处
  • 尝试使用 php 发送 POST 请求,无论我做什么,我都会收到“HTTP ERROR 500”

    为了发出 HTTP 请求 有人建议我尝试使用 PHP 并给了我一段代码 url https example com dashboard api data array to gt PHONE NUMBER from gt SENDER ID
  • 如何检测字符串中的非 ASCII 字符?

    如果我有一个 PHP 字符串 如何以有效的方式确定它是否至少包含一个非 ASCII 字符 我所说的非 ASCII 字符是指不属于该表的任何字符 http www asciitable com http www asciitable com
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • PHP 无法加载动态库“php_pdo_oci.dll”

    我在 Windows 8 上运行 Apache 2 4 7 和 PHP 5 5 9 我安装了 PHPUnit 并开始弹出此警告图像 警告 是的 我在 php ini 中启用了扩展加载以及 extension dir 以更正文件夹 并且该文件
  • 在 PHP 中比较两个对象的最快方法是什么?

    假设我有一个对象 在本例中为 User 对象 并且我希望能够使用单独的类来跟踪更改 用户对象不必以任何方式改变它的行为才能发生这种情况 因此 我的单独的类创建它的 干净 副本 将其存储在本地某个位置 然后可以将 User 对象与原始版本进行
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • 未传递“client_reference_id”参数

    我使用 Stripe Checkout Stripe 版本 2016 07 06 我想通过参数 client reference id 恢复个性化数据 但在 JSON 中 当我有金额或电子邮件时 我找不到它 我是在测试环境中 你能帮我吗 先
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 如何将我的 init 函数中的代码集中到所有控制器中?

    public function init this gt view gt user Zend Auth getInstance gt getIdentity this gt view gt siteName Zend Registry ge
  • Facebook 应用程序无法获取会话

    我正在 Heroku 上为 Facebook 开发一个非常基本的 PHP 应用程序 它显示非常基本的用户信息 如姓名 个人资料图片 但该应用程序在 getToken 方法中停止 我在登录我的个人资料后尝试了该应用程序 但仍然出现相同的消息
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • 如何将 Smarty 3 包含到 Laravel 4 中?

    我是 Laravel 的新手 所以仍在习惯这些概念 但是我有大约 10 年的使用 Smarty 的经验 所以我希望利用这一点 除了事实上 Blade 似乎缺乏太多我发现有用且在 Smarty 中开箱即用的功能 但无论如何除了这个问题的要点之
  • 我可以在 PHP 会话变量中安全地存储用户名和密码吗?

    我想在 REST api 之上制作一个轻量级的 web 应用程序 用户只需进行一次身份验证 从那时起 所有针对 web api 的请求都希望通过以某种方式保持用户名和密码有效来完成 我已经做了一个工作原型我在哪里将用户名和密码存储在会话变量
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function

随机推荐

  • 部署后对参数的更改未显示在报表服务器上

    我的 SSRS 2008 报告中有 7 个参数 3 个字符串多重选择 1 个日期时间 3 个字符串值 并且我已在默认值 它在我的 Visual Studio 2008 预览窗口中工作正常 但是部署后到我的报告服务器 未选中参数的 NULL
  • 仅打印 Python 中特定键的字典术语的值

    我想知道如果我有一本字典并且我想只打印出特定键的值 我会在Python 中做什么 它将位于变量中以及 dict Lemonade 1 45 87 Coke 23 9 23 Water 98 2 127 inp input Select ke
  • 是否可以从模拟器内访问照片的地理标记元数据?

    我编写了一个应用程序来检索照片的 GPS 元数据 它可以在我的 iPhone 上运行 但不能在模拟器中运行 如果我将包含地理标签的照片拖到模拟器上 它就会被放入照片库中 然后 我的应用程序发出以下代码 ALAssetRepresentati
  • nginx 位置通过文件扩展名语法拒绝

    我编写了两种不同的设置 一种用于拒绝对点文件的访问 另一种用于拒绝对文件扩展名列表的访问 但是 是否有任何语法可以拒绝其他文件扩展名列表中的点文件 location 7z bak bash bz2 config dist engine fl
  • 使用应用程序脚本拆分(分解)谷歌电子表格中的合并表格单元格

    当操作 复制 移动 包含合并单元格的范围时 我总是收到错误 您的粘贴与合并单元格重叠 请取消合并单元格并重试 但是当尝试使用以下命令取消合并范围内的单元格时Range breakApart 我收到另一个错误 所选单元格无法合并 这更令人困惑
  • 优雅的 Haskell 案例/错误处理

    我试图更好地理解如何处理 haskell 中的错误情况 并编写了一些代码来帮助我解决这个问题 是否有更好的方法 更优雅 更短 更通用 来处理多个替代方案 例如嵌套的 case 表达式 关于该主题有什么好的教程吗 本例的虚构类型 这有点简化
  • Python:将 Unicode-Hex-String 转换为 Unicode

    我有一个由带有该函数的 unicode 字符串制成的十六进制字符串 def toHex s res for c in s res 02X ord c at least 2 hex digits can be more return res
  • 推动 JavaScript 性能的限制是什么?

    在过去的几个月里 我一直在构建一个原型页面 该页面使用了大量 SVG 并且通常包含很多元素 JavaScript 和服务器端 大量 AJAX 也正在处理大量数据 页面上有数千个事件侦听器 重点是 它相当重 在 JS 中执行此类操作的最大障碍
  • Android 应用程序的 Facebook 登录(使用释放密钥)

    我正在尝试在 Google Play 上发布我的应用程序 我的应用程序中有 Facebook 登录信息 直到昨天 一切都工作正常 直到我运行应用程序时debug keystore 但是 当我使用自己的发布密钥并签署我的应用程序时 Faceb
  • 如何在Electron框架中使用html模板?

    我需要构建一个具有多个窗口的跨平台应用程序 所以我想知道如何在Electron中使用html模板 基于类似的问题据我所知 Electron 中没有内置的 html 模板语言 这实际上很棒 因为它允许您使用任何其他模板语言 我目前正在玩ejs
  • 使用远程计算机通过 JupyterLab 打开网站(类似于代理)

    我通过连接SSH到正在运行的远程计算机JupyterLab 当我在中运行以下代码时JupyterLab我看到我的本地计算机的 IP 地址 from IPython display import IFrame IFrame src https
  • 如何在 Android 中的列表视图中显示 Dropbox 文件?

    我已经在这里浏览答案有一段时间了 并在我的代码中使用了大部分答案 但它似乎仍然不起作用 我只想显示 Dropbox 帐户中内容的列表视图 并为用户提供下载文件 文件夹的选项 我的 MainActivity 过去常常在打开后立即崩溃 用处理
  • 如何使用 CURL 请求构建、准备和设置 JWT 授权承载令牌

    为了发送和接收授权持有人 我确实阅读了此内容使用 cURL 设置 Bearer 令牌的正确方法和这个如何正确使用 Bearer 代币 这是我的代码 url http www example com phpinfo php data arra
  • 从不可变类型继承[重复]

    这个问题在这里已经有答案了 我想知道继承是如何运作的int list string和其他不可变类型 基本上我只是继承一个这样的类 class MyInt int def init self value 我似乎无法弄清楚 如何设置像它所设置的
  • DataGridView 的自定义单元格绘制的文本溢出

    这是我的细胞绘画方法 DataGridView grid DataGridView sender if e RowIndex 1 e ColumnIndex 1 return if grid Rows e RowIndex Cells e
  • XAML 数据绑定类单例 MVVM 对象

    NOTES 我是一个菜鸟 有时我会陷入简单和 或愚蠢的想法 这就是其中之一 我了解了数据绑定的一般概念 我已经浏览了网上的一些教程 并通过大量文本在谷歌上搜索了几个小时 这只是让我有点困惑 PROBLEM 我正在尝试Windows Phon
  • 输入“=”作为单元格中的第一个字符

    我有一个正在运行的 VBA 宏 并且通常需要将 作为单元格中的第一个字符 单元格中填充有 Domestic Domestic 等值 现在 我将 替换为 IS 作为快速修复 但如果我可以保留等号 我希望它能够与使用 等符号的单元格保持一致 当
  • 使用 GWT 上传前检查文件大小

    我正在使用 FormPanel 将文件上传到服务器 我想做的是在上传之前确保文件大小小于给定大小 例如 10MB 在服务器端 我有一个 javax servlet http HttpServlet 我在其中重写 doPost 这里 Http
  • Golang 依赖管理最佳实践

    在Golang中 我们可以指定GitHub上的开源库作为依赖项 例如 import github com RichardKnop somelibrary 这将尝试根据您的 Go 版本查找分支 如果我理解正确的话 默认为 master 因此无
  • 在php中写入exif数据

    我正在尝试创建一个网站 可以在其中添加和修改 JPEG 文件中的元数据 有没有一种方法可以让我以相当简单的方式写入 exif 数据 我见过一两个例子 但它们太复杂 在我给出的时间范围内无法掌握 我了解 IPTC 并且我知道可以将元数据添加到