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_Writeexiftool_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

1 回复

更多关于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应用程序。

回到顶部