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

使用metadata-extractor访问图片遇TAG_IMAGE_DATA未解析错误,求新方法

解决metadata-extractor中TAG_IMAGE_DATA未定义的问题

错误原因

metadata-extractor版本更新后,原ExifDirectoryBase类已被重构,TAG_IMAGE_DATA常量不再属于这个父类,而是被移至**JpegDirectory**类中(针对JPEG格式的图片/视频帧)。

修复方案

1. 替换常量引用并导入正确类

将原来的ExifDirectoryBase.TAG_IMAGE_DATA替换为JpegDirectory.TAG_IMAGE_DATA,同时导入对应的解析类:

import com.drew.imaging.jpeg.JpegMetadataReader
import com.drew.metadata.jpeg.JpegDirectory

2. 完整的视频帧图片字节获取代码

假设你已从视频URL获取到JPEG格式的帧图片流,解析并提取图像数据的代码示例:

import com.drew.imaging.jpeg.JpegMetadataReader
import com.drew.metadata.jpeg.JpegDirectory
import java.net.URL
import java.io.InputStream

fun extractImageBytesFromVideoFrameUrl(videoFrameUrl: String): ByteArray? {
    var inputStream: InputStream? = null
    return try {
        inputStream = URL(videoFrameUrl).openStream()
        // 解析图片元数据
        val metadata = JpegMetadataReader.readMetadata(inputStream)
        // 获取JPEG目录实例
        val jpegDir = metadata.getFirstDirectoryOfType(JpegDirectory::class.java)
        // 提取图像字节数据
        jpegDir?.getByteArray(JpegDirectory.TAG_IMAGE_DATA)
    } catch (e: Exception) {
        e.printStackTrace()
        null
    } finally {
        inputStream?.close()
    }
}

3. 更高效的替代方案(若无需元数据)

如果你的需求只是获取图片字节而非解析元数据,直接读取输入流字节更简单高效:

import java.net.URL
import java.io.InputStream

fun getImageBytesDirectly(videoFrameUrl: String): ByteArray? {
    var inputStream: InputStream? = null
    return try {
        inputStream = URL(videoFrameUrl).openStream()
        inputStream.readBytes()
    } catch (e: Exception) {
        e.printStackTrace()
        null
    } finally {
        inputStream?.close()
    }
}

注意事项

  • 若视频帧为非JPEG格式(如PNG),需对应使用PngMetadataReader和PngDirectory,查找该格式下的图像数据常量。
  • 确保依赖的metadata-extractor版本为最新稳定版,避免API兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:08