golang提取文件元数据(EXIF/IPTC)插件库go-exiftool的使用
Golang提取文件元数据(EXIF/IPTC)插件库go-exiftool的使用
简介
go-exiftool是一个Golang库,它封装了ExifTool的功能。ExifTool的主要用途是从多种文件类型中提取和更新尽可能多的元数据(EXIF、IPTC、XMP、GPS等)。go-exiftool使用ExifTool的stay_open
功能来优化性能。
要求
go-exiftool需要安装ExifTool。
- 在Debian上:
sudo apt-get install exiftool
默认情况下,go-exiftool
会在$PATH中查找exiftool
二进制文件,但也可以指定其他位置(参见SetExiftoolBinaryPath
功能选项)。
使用示例
元数据提取
package main
import (
"fmt"
"github.com/barasher/go-exiftool"
)
func main() {
// 初始化exiftool实例
et, err := exiftool.NewExiftool()
if err != nil {
fmt.Printf("初始化错误: %v\n", err)
return
}
defer et.Close() // 确保关闭exiftool实例
// 提取指定文件的元数据
fileInfos := et.ExtractMetadata("testdata/20190404_131804.jpg")
// 遍历提取到的元数据
for _, fileInfo := range fileInfos {
if fileInfo.Err != nil {
fmt.Printf("处理文件%v时出错: %v\n", fileInfo.File, fileInfo.Err)
continue
}
// 打印所有元数据字段
for k, v := range fileInfo.Fields {
fmt.Printf("[%v] %v\n", k, v)
}
}
}
输出示例:
[FOV] 69.4 deg
[Orientation] Rotate 90 CW
[ColorSpace] sRGB
[Compression] JPEG (old-style)
[YCbCrSubSampling] YCbCr4:2:2 (2 1)
[Aperture] 1.7
[ColorComponents] 3
[SubSecCreateDate] 2019:04:04 13:18:03.0937
[FileSize] 26 kB
[FileAccessDate] 2019:05:17 22:44:26+02:00
[DateTimeOriginal] 2019:04:04 13:18:03
[CreateDate] 2019:04:04 13:18:03
(...)
元数据更新
参考示例函数ExampleExiftool_Write
在exiftool_sample_test.go
中。
版本变更
- v1.1.0: 初始版本
- v1.1.1: 添加文件元数字段的类型化获取器
- v1.1.3: 添加Mac和Windows支持,提高错误可读性
- v1.2.0: 添加stdout和stderr缓冲区配置功能
- v1.3.0: 添加设置ExifTool的
-charset
参数的功能选项 - v1.3.1: 修复macOS上的行分隔符问题
- v1.3.2: 添加FreeBSD支持
- v1.4.0: 添加"NoPrintConversion"功能选项
- v1.5.0: 添加"ExtractEmbedded"功能选项
- v1.6.0: 添加"ExtractAllBinaryMetadata"功能选项
- v1.6.1: 添加"SetExiftoolBinaryPath"功能选项
- v1.6.2: 多项改进
- v1.7.0: 添加元数据写入功能
- v1.8.0: 修复文件夹处理bug,添加新错误类型,添加日期格式和GPS坐标格式选项
- v1.9.0: 添加指定
-api
参数的选项 - v1.10.0: 添加在元数据键前添加组名的选项
更多关于golang提取文件元数据(EXIF/IPTC)插件库go-exiftool的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang提取文件元数据(EXIF/IPTC)插件库go-exiftool的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用go-exiftool提取文件元数据(EXIF/IPTC)
go-exiftool是一个Go语言封装的ExifTool库,ExifTool是一个强大的元数据读写工具,支持几乎所有类型的元数据,包括EXIF、IPTC、XMP等。
安装
首先安装go-exiftool和ExifTool本身:
go get github.com/barasher/go-exiftool
# 同时需要安装ExifTool(不同系统安装方式不同)
# macOS: brew install exiftool
# Ubuntu: sudo apt-get install libimage-exiftool-perl
# Windows: 下载https://exiftool.org/
基本使用示例
package main
import (
"fmt"
"github.com/barasher/go-exiftool"
)
func main() {
// 初始化ExifTool实例
et, err := exiftool.NewExiftool()
if err != nil {
fmt.Printf("初始化ExifTool失败: %v\n", err)
return
}
defer et.Close() // 重要:使用完毕后关闭
// 要提取元数据的文件路径
filePath := "example.jpg"
// 提取文件元数据
fileInfos := et.ExtractMetadata(filePath)
// 处理结果
for _, fileInfo := range fileInfos {
if fileInfo.Err != nil {
fmt.Printf("处理文件 %v 时出错: %v\n", fileInfo.File, fileInfo.Err)
continue
}
fmt.Printf("文件: %s\n", fileInfo.File)
fmt.Println("元数据:")
for k, v := range fileInfo.Fields {
fmt.Printf(" %s: %v\n", k, v)
}
}
}
高级用法
1. 提取特定元数据字段
// 只提取部分字段
opts := []exiftool.Option{
exiftool.Fields("DateTimeOriginal", "Make", "Model", "GPSLatitude", "GPSLongitude"),
}
et, err := exiftool.NewExiftool(opts...)
// 然后使用et.ExtractMetadata()提取
2. 批量处理多个文件
files := []string{"image1.jpg", "image2.jpg", "image3.png"}
fileInfos := et.ExtractMetadata(files...)
for _, fi := range fileInfos {
if fi.Err != nil {
continue
}
fmt.Printf("%s 拍摄于 %v\n", fi.File, fi.Fields["DateTimeOriginal"])
}
3. 写入元数据
// 创建写入器
etw, err := exiftool.NewExiftoolWriter()
if err != nil {
panic(err)
}
defer etw.Close()
// 设置要写入的元数据
metadata := map[string]interface{}{
"Artist": "张三",
"Copyright": "2023 我的公司",
"Keywords": []string{"旅行", "夏天", "海滩"},
}
// 写入元数据
err = etw.Write("photo.jpg", metadata)
if err != nil {
fmt.Printf("写入元数据失败: %v\n", err)
}
4. 处理二进制数据
// 直接从字节切片读取元数据
imgData, _ := os.ReadFile("photo.jpg")
fileInfos := et.ExtractMetadataFromBuffer(imgData)
常用元数据字段
-
EXIF相关:
- Make: 相机制造商
- Model: 相机型号
- DateTimeOriginal: 拍摄时间
- ExposureTime: 曝光时间
- FNumber: 光圈值
- ISOSpeedRatings: ISO值
- FocalLength: 焦距
-
IPTC相关:
- Headline: 标题
- Keywords: 关键词
- Caption-Abstract: 描述
- Creator: 作者
- CopyrightNotice: 版权信息
-
GPS相关:
- GPSLatitude: 纬度
- GPSLongitude: 经度
- GPSAltitude: 海拔高度
性能优化
对于批量处理大量文件,可以:
// 初始化时设置并发数
et, err := exiftool.NewExiftool(
exiftool.ProcessCount(4), // 使用4个并发进程
)
错误处理
fileInfos := et.ExtractMetadata("missing.jpg")
for _, fi := range fileInfos {
if fi.Err != nil {
switch fi.Err {
case exiftool.ErrFileNotFound:
fmt.Printf("文件不存在: %s\n", fi.File)
case exiftool.ErrUnsupportedFileType:
fmt.Printf("不支持的文件类型: %s\n", fi.File)
default:
fmt.Printf("处理错误: %v\n", fi.Err)
}
continue
}
// 处理正常情况...
}
go-exiftool是一个功能强大且易于使用的库,适合需要处理图像、视频等文件元数据的Go应用程序。