背景: 我一直在尝试阅读 Adobe Bridge CS3 中分配的评级,使用 php 的知识共享元数据工具包,但没有成功。我正在使用共享主机,所以我没有机会用不同的模块重新编译 php。
是否有 php 代码可用于读取嵌入在 .jpg 文件中的评级?我读过这是文件中的 xmp (xml) 格式部分。
背景: 我一直在尝试阅读 Adobe Bridge CS3 中分配的评级,使用 php 的知识共享元数据工具包,但没有成功。我正在使用共享主机,所以我没有机会用不同的模块重新编译 php。
是否有 php 代码可用于读取嵌入在 .jpg 文件中的评级?我读过这是文件中的 xmp (xml) 格式部分。
我在这里发布我的解决方案,以防其他人遇到类似问题并阅读此线程。以下是我的发现:
Windows Vista将评级添加到文件中嵌入的 exif 部分
Adobe Bridge将另一个部分添加到包含 xml 格式数据的 jpg 文件中。xml+数据结构称为xmp文件。
我还没有使用 Adobe bridge 处理该文件,这就是为什么我无法使用 Metadata 工具包读取 xmp 数据的原因。
使用知识共享 - 元数据工具包,我能够使用以下代码读取评级。此代码是 Drupal 模块的一部分,一些引用的变量是 Drupal 设置: variable_get() 是一个 Drupal 函数,用于从持久数据存储中读取变量。
include_once("PHP_JPEG_Metadata_Toolkit_1.11/JPEG.php");
include_once("PHP_JPEG_Metadata_Toolkit_1.11/Photoshop_File_Info.php");
include_once("PHP_JPEG_Metadata_Toolkit_1.11/EXIF.php");
include_once("PHP_JPEG_Metadata_Toolkit_1.11/XMP.php");
$photodir = variable_get('rotate_images_sourcefiles_dir',"sites/default/files/imageNodes");
$rating_threshold = variable_get('rotate_images_rating_threshold',3);
$allImages=dir($photodir);
$filenames = scandir($photodir);
foreach($filenames as $filename){
$评级=空;
$info = pathinfo($filename);
if (strtolower($info['extension'])=="jpg"){
// 首先尝试从 EXIF 数据中获取评级,这是 Windows Vista 存储的位置
$exif = get_EXIF_JPEG( $photodir . "/" . $filename );
$rating = $exif[0][18246]['Data'][0];
$jpeg_header = get_jpeg_header_data($photodir . "/" . $filename );
// 如果EXIF数据中没有找到评分,可能是在Adobe格式的xmp部分
if ($rating == null){
如果($jpeg_header != 假){
$xmp = get_XMP_text($jpeg_header);
$xmpArray = read_XMP_array_from_text($xmp);
$rating = $xmpArray[0]['children'][0]['children'][0][attributes]['xap:Rating'];
}
}
}
}
我确实需要通过向 EXIF Tags 数组添加一个附加条目来修改元数据工具包中的EXIF_Tags.php文件。我向作者报告了这一点,但我不相信他不再维护该模块。源代码在 sourceforge 上,但我不知道如何发布补丁。因此,您可能需要自己更改 EXIF.php 以使代码正常工作。
'EXIF' => 数组(
// Exif IFD
18246 => 数组(“名称”=>“评级”,
'类型' => "数字" ),
从理论上讲,如果您使用fgets它,您应该能够阅读它。如果您知道本节从文件中的字节数开始,将会很有帮助。