【问题标题】:Tagging images with php用 php 标记图像
【发布时间】:2016-01-28 03:21:36
【问题描述】:

我想编写一个脚本,可以标记图像并将标记保存在 FILE 中,而不是外部数据库中。我还需要通过 php 从文件中读取标签。

我为什么要这样做?

右键单击图像并选择属性,然后单击详细信息,然后单击标签,然后添加标签,至少可以说是乏味的。我找不到在 Windows 中快速添加标签的任何快捷方式,所以我想编写自己的脚本来做到这一点。

这可能吗?

我不知道是不是这样,每当我在同一行中搜索图像和标签时,我都会获得用于 html 教程的图像标签或将标签保存在外部数据库中的人。我真的找不到任何好的资源,如果有人能推荐一些我可以看看的,我将不胜感激。

到目前为止我有什么?

我可以列出我硬盘上的所有图像并单击图像,然后会出现一个弹出窗口供我输入标签。然后我将此标签发送到一个 php 文件,等待我对其进行处理...

为什么我不想将标签保存在外部数据库中?

我不会一直运行我的本地主机。如果我复制标签应该使用的图像。

任何有关这方面的信息都会很棒。

【问题讨论】:

  • 你的图片标签是exif吗? php.net/manual/en/book.exif.php 可能很有趣
  • 感谢您提供的链接,我认为这可能行得通。但是,并非所有图像都来自同一来源,并且有些图像具有不同的文件类型,例如 png,我不确定如何标记。我知道 png 规范可以保存文本,但我不确定如何添加标签。我现在正在工作,但我回家后会测试那个库。
  • 我在 Windows 7 上看不到 PNG 图像的“标签”。对于 jpg 文件,他们似乎使用 Adob​​e XMP 存储标签并将其存储为 EXIF 字段(不确定是哪一个然而,对不起)。
  • Adobe XMP 看起来很有趣,但是我看到只有一个用于 java 和 actionscript 的库可用,但我将尝试使用它。谢谢
  • 它必须是普通的 PHP 还是您乐意执行外部程序来进行标记?如果是这样,ExifTool 是一个功能丰富的 Perl 命令行应用程序,可作为独立的可执行文件用于 Windows。

标签: php jquery windows image filesystems


【解决方案1】:

你可以使用

  • iptcembed 将二进制 IPTC 数据嵌入到 JPEG 图像中
  • exif-read-data 从 JPEG 或 TIFF 读取 EXIF 标头
  • 如何从 JPEG 文件中读取标题标签

    getimagesize('./phplogo.jpg', $info);
    $title = '';
    if (isset($info["APP13"])) {
       $iptc  = iptcparse ($info["APP13"]);
       $title = (isset($iptc["2#085"][0])) ? $iptc["2#085"][0] : NULL;
    }
    print $title;
    

    如何为 JPEG 添加标题标签
    注意:您只需操作 $iptc 数组并指定文件路径
    这是来自iptcembed 的一个工作示例

    // iptc_make_tag() function by Thies C. Arntzen
    function iptc_make_tag($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;
    }
    
    // Path to jpeg file
    $path = './phplogo.jpg';
    
    // Set the IPTC tags
    $iptc = array(
        '2#085' => 'Anis TITLE'
    );
    
    // Convert the IPTC tags into binary code
    $data = '';
    
    foreach($iptc as $tag => $string)
    {
        $tag = substr($tag, 2);
        $data .= iptc_make_tag(2, $tag, $string);
    }
    
    // Embed the IPTC data
    $content = iptcembed($data, $path);
    
    // Write the new image data out to the file.
    $fp = fopen($path, "wb");
    fwrite($fp, $content);
    fclose($fp);
    

    这里是 IPTC 索引的完整列表

    DEFINE('IPTC_OBJECT_NAME',                      '2#005');
    DEFINE('IPTC_EDIT_STATUS',                      '2#007');
    DEFINE('IPTC_PRIORITY',                         '2#010');
    DEFINE('IPTC_CATEGORY',                         '2#015');
    DEFINE('IPTC_SUPPLEMENTAL_CATEGORY',            '2#020');
    DEFINE('IPTC_FIXTURE_IDENTIFIER',               '2#022');
    DEFINE('IPTC_KEYWORDS',                         '2#025');
    DEFINE('IPTC_RELEASE_DATE',                     '2#030');
    DEFINE('IPTC_RELEASE_TIME',                     '2#035');
    DEFINE('IPTC_SPECIAL_INSTRUCTIONS',             '2#040');
    DEFINE('IPTC_REFERENCE_SERVICE',                '2#045');
    DEFINE('IPTC_REFERENCE_DATE',                   '2#047');
    DEFINE('IPTC_REFERENCE_NUMBER',                 '2#050');
    DEFINE('IPTC_CREATED_DATE',                     '2#055');
    DEFINE('IPTC_CREATED_TIME',                     '2#060');
    DEFINE('IPTC_ORIGINATING_PROGRAM',              '2#065');
    DEFINE('IPTC_PROGRAM_VERSION',                  '2#070');
    DEFINE('IPTC_OBJECT_CYCLE',                     '2#075');
    DEFINE('IPTC_BYLINE',                           '2#080');
    DEFINE('IPTC_BYLINE_TITLE',                     '2#085');
    DEFINE('IPTC_CITY',                             '2#090');
    DEFINE('IPTC_PROVINCE_STATE',                   '2#095');
    DEFINE('IPTC_COUNTRY_CODE',                     '2#100');
    DEFINE('IPTC_COUNTRY',                          '2#101');
    DEFINE('IPTC_ORIGINAL_TRANSMISSION_REFERENCE',  '2#103');
    DEFINE('IPTC_HEADLINE',                         '2#105');
    DEFINE('IPTC_CREDIT',                           '2#110');
    DEFINE('IPTC_SOURCE',                           '2#115');
    DEFINE('IPTC_COPYRIGHT_STRING',                 '2#116');
    DEFINE('IPTC_CAPTION',                          '2#120');
    DEFINE('IPTC_LOCAL_CAPTION',                    '2#121');
    

    【讨论】:

    • 当我尝试使用 exif_read_data 读取标签时,我得到: ["Keywords"]=> string(22) "????????????????? ??????” ["UndefinedTag:0xEA1C"] 知道吗?
    • 感谢您在答案中添加示例代码。使用 iptcembed 添加标签没有问题,但是我无法获取关键字。如果我使用 exif_read_data 我会像上面评论中提到的那样得到垃圾。如果我使用 2#025(关键字/标签)的示例代码,它就不起作用。如果我 var_dump $info["APP13"] 我得到一个很长的字符串,但 iptcparse 返回 FALSE。 Windows 确实正确读取了数据,我可以看到正在添加标签。我就是不能再接近他们了。有小费吗?感谢您的所有努力。
    • 我搞定了,我用了这个:$test = exif_read_data('1.jpg', 0, true); $test = mb_convert_encoding($test['IFD0']['Keywords'], 'UTF-8', 'byte2le'); var_dump($test);
    【解决方案2】:

    您可以使用PHPExiftool 将元数据写入文件中,如下所示(引用自 github 页面):

    <?php
    
    require __DIR__ . '/vendor/autoload.php';
    
    use Monolog\Logger;
    use PHPExiftool\Writer;
    use PHPExiftool\Driver\Metadata\Metadata;
    use PHPExiftool\Driver\Metadata\MetadataBag;
    use PHPExiftool\Driver\Tag\IPTC\ObjectName;
    use PHPExiftool\Driver\Value\Mono;
    
    $logger = new Logger('exiftool');
    $Writer = Writer::create($logger);
    
    $bag = new MetadataBag();
    $bag->add(new Metadata(new ObjectName(), new Mono('Pretty cool subject')));
    
    $Writer->write('image.jpg', $bag);
    

    如果您想跟踪您编写的元数据,您可以轻松地使用php's md5_file() function 来获取您已修改元数据的文件的标识符,然后在文本文件中写入一行结果哈希后跟您编写的元数据,由分隔符分隔,例如“,”(逗号)。该文本文件中的每一行都代表一个由您的脚本修改的文件。

    【讨论】:

    • 谢谢,这看起来很有希望。当我回到家时,我肯定会对此进行测试。如果它有效,我会将此响应标记为答案。大约需要 8 个小时。
    • 我从来都不擅长让 github 代码工作......每个人似乎都在使用我不知道如何操作的 composer。 Halayem Anis 发布的答案让我取得了成功,但我无法再次读取数据。我确实找到了另一个更新的 Exiftool 包装器,所以我会试一试。谢谢你的建议。
    • 你应该在composer上找一个“入门”,绝对值得。
    猜你喜欢
    • 2014-06-15
    • 2017-11-12
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2011-11-09
    • 2020-07-10
    相关资源
    最近更新 更多