You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何正确获取图片的Description元数据

问题原因

无法读取到Description元数据的核心原因有两点:

  • PHP原生exif_read_data函数仅支持解析标准EXIF结构内的标签,从你贴出的运行结果看,FILE.SectionsFound仅返回ANY_TAG, IFD0, GPS,说明目标图片的描述信息没有存储在标准EXIF的IFD0段(标准EXIF规范中,图片描述对应IFD0.ImageDescription标签,标签ID为270)。
  • GIMP写入图片Description时,默认优先将信息存储在XMP元数据段或IPTC元数据段,这两个段不在PHP原生exif扩展的默认解析范围内,因此遍历返回结果找不到对应字段。
解决方法

优先读取XMP段(适配GIMP默认写入逻辑)

GIMP保存图片时填写的描述默认写入XMP的dc:description节点,可通过解析文件内的XMP段获取内容,同时兼容标准EXIF、IPTC段的读取,代码示例:

function getImageDescription(string $filePath): ?string
{
    // 先读取标准EXIF的ImageDescription,兼容旧格式图片
    if (function_exists('exif_read_data')) {
        $exif = @exif_read_data($filePath, 'IFD0', true);
        if (!empty($exif['IFD0']['ImageDescription'])) {
            return trim($exif['IFD0']['ImageDescription']);
        }
    }

    // 读取文件内容解析XMP段
    $fileContent = file_get_contents($filePath);
    if (!$fileContent) {
        return null;
    }

    // 定位XMP段起止位置
    $xmpStart = strpos($fileContent, '<x:xmpmeta');
    $xmpEnd = strpos($fileContent, '</x:xmpmeta>');
    if ($xmpStart !== false && $xmpEnd !== false) {
        $xmpLength = $xmpEnd - $xmpStart + strlen('</x:xmpmeta>');
        $xmpData = substr($fileContent, $xmpStart, $xmpLength);
        // 匹配dc:description节点内容
        if (preg_match('/<dc:description>.*?<rdf:li[^>]*>(.*?)<\/rdf:li>.*?<\/dc:description>/s', $xmpData, $matches)) {
            return trim($matches[1]);
        }
    }

    // XMP未找到时尝试读取IPTC段
    getimagesize($filePath, $fileInfo);
    if (!empty($fileInfo['APP13'])) {
        $iptc = iptcparse($fileInfo['APP13']);
        // IPTC规范中图片描述对应2#120字段
        if (!empty($iptc['2#120'])) {
            return trim(implode('', $iptc['2#120']));
        }
    }

    return null;
}

// 调用示例
$description = getImageDescription('img.jpg');
echo $description;

调整exif_read_data参数兜底

你之前调用exif_read_data时第二个参数传值为0,可以显式指定需要解析的段,尝试读取可能遗漏的EXIF标签:

// 第二个参数指定要解析的所有段类型
$exif = exif_read_data('img.jpg', 'ANY_TAG,IFD0,EXIF,COMMENT', true);
// 直接读取ImageDescription字段
var_dump($exif['IFD0']['ImageDescription'] ?? null);
注意事项
  • 如果图片在保存时被压缩工具、传输流程去除了元数据,所有方法都无法读取到Description,可以先在GIMP中打开图片属性窗口,确认Description存储在EXIF、XMP、IPTC哪个标签页下,再对应调整读取逻辑。
  • 读取时建议按照XMP > 标准EXIF > IPTC的优先级匹配,可覆盖绝大多数图片的描述存储场景。

内容的提问来源于stack exchange,提问作者provance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:33:16