使用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
相关产品推荐
相关产品推荐

