pub struct ExifTool { /* private fields */ }Expand description
ExifTool 主结构体
使用 -stay_open 模式保持 ExifTool 进程运行,
避免每次操作都重新启动进程的开销。
§线程安全
ExifTool 是线程安全的,可以在多个线程间共享。
内部使用 Arc<Mutex> 保护进程通信。
Implementations§
Source§impl ExifTool
impl ExifTool
Sourcepub fn builder() -> ExifToolBuilder
pub fn builder() -> ExifToolBuilder
创建 ExifTool 构建器
使用 Builder 模式可以更灵活地配置 ExifTool 实例。
§示例
use exiftool_rs_wrapper::ExifTool;
// 使用自定义路径
let exiftool = ExifTool::builder()
.executable("/usr/local/bin/exiftool")
.build()?;Sourcepub fn with_config<P: AsRef<Path>>(&self, path: P) -> Self
pub fn with_config<P: AsRef<Path>>(&self, path: P) -> Self
基于当前实例附加配置文件参数(-config)
Sourcepub fn query<P: AsRef<Path>>(&self, path: P) -> QueryBuilder<'_>
pub fn query<P: AsRef<Path>>(&self, path: P) -> QueryBuilder<'_>
查询单个文件的元数据
返回一个 QueryBuilder,可以使用 Builder 模式配置查询选项。
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
// 基本查询
let metadata = exiftool.query("photo.jpg").execute()?;
// 高级查询
let metadata = exiftool.query("photo.jpg")
.include_unknown(true)
.tag("Make")
.tag("Model")
.execute()?;Sourcepub fn query_batch<P: AsRef<Path>>(&self, paths: &[P]) -> BatchQueryBuilder<'_>
pub fn query_batch<P: AsRef<Path>>(&self, paths: &[P]) -> BatchQueryBuilder<'_>
批量查询多个文件的元数据
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
let paths = vec!["photo1.jpg", "photo2.jpg", "photo3.jpg"];
let results = exiftool.query_batch(&paths)
.tag("FileName")
.tag("ImageSize")
.execute()?;
for (path, metadata) in results {
println!("{}: {:?}", path.display(), metadata.get("FileName"));
}Sourcepub fn write<P: AsRef<Path>>(&self, path: P) -> WriteBuilder<'_>
pub fn write<P: AsRef<Path>>(&self, path: P) -> WriteBuilder<'_>
写入元数据到文件
返回一个 WriteBuilder,可以使用 Builder 模式配置写入选项。
§警告
默认情况下,ExifTool 会创建备份文件(filename_original)。
使用 overwrite_original(true) 可以不创建备份直接覆盖原文件。
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
// 基本写入
exiftool.write("photo.jpg")
.tag("Copyright", "© 2026 My Company")
.execute()?;
// 高级写入
exiftool.write("photo.jpg")
.tag("Artist", "Photographer")
.tag("Copyright", "© 2026")
.delete("Comment")
.overwrite_original(true)
.execute()?;Sourcepub fn read_tag<T, P, S>(&self, path: P, tag: S) -> Result<T>
pub fn read_tag<T, P, S>(&self, path: P, tag: S) -> Result<T>
读取单个标签的值
这是 query().tag().execute() 的快捷方式。
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
let make: String = exiftool.read_tag("photo.jpg", "Make")?;
println!("相机制造商: {}", make);
// 使用 TagId
use exiftool_rs_wrapper::TagId;
let model: String = exiftool.read_tag("photo.jpg", "Model")?;Sourcepub fn version(&self) -> Result<String>
pub fn version(&self) -> Result<String>
获取 ExifTool 版本
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
let version = exiftool.version()?;
println!("ExifTool version: {}", version);获取所有支持的标签列表
获取可写标签列表(对应 -listw)
Sourcepub fn list_file_extensions(&self) -> Result<Vec<String>>
pub fn list_file_extensions(&self) -> Result<Vec<String>>
获取支持的文件扩展名列表(对应 -listf)
Sourcepub fn list_groups(&self) -> Result<Vec<String>>
pub fn list_groups(&self) -> Result<Vec<String>>
获取支持的分组列表(对应 -listg)
Sourcepub fn list_groups_family(&self, family: u8) -> Result<Vec<String>>
pub fn list_groups_family(&self, family: u8) -> Result<Vec<String>>
获取指定族的分组列表(对应 -listg[NUM])
ExifTool 将标签分组为不同的族(family),使用 -listg[NUM] 可以列出特定族的分组。
§参数
family- 分组族编号(0-7),对应-listg0到-listg7- Family 0: 信息类型(EXIF、IPTC、XMP 等)
- Family 1: 特定位置(MakerNotes、Composite 等)
- Family 2: 类别(Image、Camera、Author 等)
- Family 3-7: 其他分类方式
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
// 获取 Family 1 的分组列表(特定位置)
let family1_groups = exiftool.list_groups_family(1)?;
println!("Family 1 分组: {:?}", family1_groups);
// 获取 Family 2 的分组列表(类别)
let family2_groups = exiftool.list_groups_family(2)?;
println!("Family 2 分组: {:?}", family2_groups);Sourcepub fn list_descriptions(&self) -> Result<Vec<String>>
pub fn list_descriptions(&self) -> Result<Vec<String>>
获取标签描述列表(对应 -listd)
Sourcepub fn list_writable_file_extensions(&self) -> Result<Vec<String>>
pub fn list_writable_file_extensions(&self) -> Result<Vec<String>>
获取可写文件类型扩展名列表(对应 -listwf)
返回 ExifTool 支持写入的文件类型扩展名列表。
与 list_file_extensions() 不同,此方法仅返回可写入元数据的文件类型。
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
let writable_exts = exiftool.list_writable_file_extensions()?;
println!("可写文件类型数量: {}", writable_exts.len());Sourcepub fn list_readable_file_extensions(&self) -> Result<Vec<String>>
pub fn list_readable_file_extensions(&self) -> Result<Vec<String>>
获取可读文件类型扩展名列表(对应 -listr)
返回 ExifTool 支持读取的文件类型扩展名列表。
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
let readable_exts = exiftool.list_readable_file_extensions()?;
println!("可读文件类型数量: {}", readable_exts.len());Sourcepub fn list_geo_formats(&self) -> Result<Vec<String>>
pub fn list_geo_formats(&self) -> Result<Vec<String>>
获取支持的 GPS 日志格式列表(对应 -listgeo)
返回 ExifTool 支持的地理标记日志文件格式列表。
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
let geo_formats = exiftool.list_geo_formats()?;
println!("支持的 GPS 日志格式: {:?}", geo_formats);Sourcepub fn capability_snapshot(&self) -> Result<CapabilitySnapshot>
pub fn capability_snapshot(&self) -> Result<CapabilitySnapshot>
生成当前 ExifTool 的能力快照
Sourcepub fn execute_multiple<S: AsRef<str>>(
&self,
commands: &[Vec<S>],
) -> Result<Vec<Response>>
pub fn execute_multiple<S: AsRef<str>>( &self, commands: &[Vec<S>], ) -> Result<Vec<Response>>
批量执行多个命令(原子多命令)
使用 -executeNUM 格式在一个事务中发送多个命令,
通过编号区分各个命令的响应。
§优势
- 减少进程间通信开销(一次性发送所有命令)
- 原子性:所有命令在一个批次中执行
- 支持复杂的读写链操作
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
// 批量执行多个命令
let commands = vec![
vec!["-ver".to_string()],
vec!["-list".to_string()],
];
let responses = exiftool.execute_multiple(&commands)?;
for (idx, response) in responses.iter().enumerate() {
println!("命令 {}: {}", idx, response.text().trim());
}Sourcepub fn delete_original<P: AsRef<Path>>(
&self,
path: P,
force: bool,
) -> Result<()>
pub fn delete_original<P: AsRef<Path>>( &self, path: P, force: bool, ) -> Result<()>
删除备份文件
使用 -delete_original 选项删除 _original 备份文件。
§参数
path- 原始文件路径(ExifTool 会找到对应的备份文件)force- 是否强制删除(使用-delete_original!)
§示例
use exiftool_rs_wrapper::ExifTool;
let exiftool = ExifTool::new()?;
// 删除 photo.jpg 的备份文件 photo.jpg_original
exiftool.delete_original("photo.jpg", false)?;
// 强制删除备份文件
exiftool.delete_original("photo.jpg", true)?;