在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数据 的相关文章

  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p
  • 在值中包含换行符

    我有一个 Word 模板 其中 php 代码中定义了值 在PHP代码中 document gt setValue Value1 value1 在word模板中 Value1 如何将包含两个值之间的断线的值包含在单词的值中 Replace n
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • 如何在类似 MVC 的页面中加载基于漂亮 URL 的类?

    我想请教一些关于如何解决这个问题的提示 我正在尝试构建自己的 MVC 网站 我了解了 URL 的基础知识 http example com blog cosplay cosplayer expo today 博客 gt 控制器cosplay
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • PHP:读取字体文件的 TrueType/OpenType 元数据

    如何阅读字体详细信息 例如 字体在其元数据中包含版权 姓氏 设计者 版本等信息 我还希望脚本能够计算文件中的字形数量 并返回字体支持的语言 例如 典型的字体可能包含西方语言 瑞典语和罗马语言支持 并具有数百个字形 它应该支持 truetyp
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • 自动建议 php 的 ajax

    我有一个 html 表单 php 脚本和 jquery 我需要一个 ajax 代码来从我的 php 脚本中进行自动建议 以下是代码 表单 html
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Joomla 页面中的自定义 php 代码

    我正在尝试将 Joomla 1 5 9 页面中的表源从页面中的硬编码 html 更改为从 SQL 数据库获取信息 执行此操作的正确方法是什么 创建一个新的模型或组件并以某种方式在页面中使用它 我找到了这些 http docs joomla
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入

随机推荐

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

    我的 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 并且我知道可以将元数据添加到