建议的PHP代码来读取Adobe Bridge CS3设置的文件评级

时间:2010-06-15 01:54:20

标签: php adobe metadata cs3 adobe-bridge

背景:我一直在尝试使用适用于php的creative commons Metadata toolkit读取Adobe Bridge CS3中分配的评级,但没有成功。我正在使用共享主机,所以我没有机会用不同的模块重新编译php。

是否有可用于读取.jpg文件中嵌入的评级的PHP代码?我已经读过这是文件中的xmp(xml)格式化部分。

2 个答案:

答案 0 :(得分:1)

我在这里发布我的解决方案以防其他人有类似问题并阅读此帖子。这是我发现的:
Windows Vista 将评级添加到文件中嵌入的exif部分 Adob​​e Bridge 在jpg文件中添加了另一部分,其中包含以xml格式化的数据。 xml +数据结构称为xmp文件。 我还没有使用Adobe bridge处理该文件,这就是我无法使用元数据工具包读取xmp数据的原因。

使用Creative Commons - 元数据工具包,我可以使用以下代码阅读评级。此代码是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){

    $rating = null;
    $info = pathinfo($filename);
    if (strtolower($info['extension'])=="jpg"){
      //  First try to get the rating from the EXIF data, this is where it is stored by Windows Vista
      $exif = get_EXIF_JPEG( $photodir . "/" . $filename );
      $rating = $exif[0][18246]['Data'][0];

      $jpeg_header = get_jpeg_header_data($photodir . "/" . $filename );
      //  If no rating was found in the EXIF data, it may be in the Adobe format xmp section
      if ($rating == null){
        if($jpeg_header != false){
          $xmp = get_XMP_text($jpeg_header);
          $xmpArray = read_XMP_array_from_text($xmp);
          $rating = $xmpArray[0]['children'][0]['children'][0][attributes]['xap:Rating'];
        }   
      }
    }
  }

我确实需要通过向EXIF标签数组添加一个附加条目来修改元数据工具包中的 EXIF_Tags.php 文件。我向作者报告了这一点,但我不相信他正在维护该模块。源代码在sourceforge上,但我不知道如何发布补丁。因此,您可能需要自己对EXIF.php进行更改以使代码正常工作。

'EXIF' => array (

// Exif IFD

18246 => array ( 'Name' => "Rating",
                'Type' => "Numeric" ), 

答案 1 :(得分:0)

理论上如果你使用fgets,你应该能够阅读它。如果您知道此部分以文件的字节开头的位置,将会很有帮助。