c#使用ExifLib库提取图像的相机型号、光圈、快门、iso、曝光时间、焦距信息等EXIF信息
近期公司组织了书画摄影比赛,本人作为摄影爱好者,平时也会拍些照片,这次比赛当然不能错过。为了提高获奖概率,选了19张图像作为参赛作品。但是,摄影作品要提交图像的光圈、曝光时间等参数。一两张还可以通过电脑自带软件右键查看图像参数并一个个复制,但现在有19张,让我一点点复制还不如直接放弃参与了。谁让咱们还有一个身份是coder,那就现场手撸个小程序批量输出图像的EXIF信息。
开发需求很简单,就是能手动选取一个文件夹,然后读取该路径下的所有文件(图片),然后提取每张图像的exif信息,并将结果显示到界面,然后将Ctrl + A复制所有信息即可。在开发上,语言选择c#,搭配WPF框架,并选择ExifLib这个轻量化的EXIF信息提取库获取图像参数信息,下图是最终的提取信息。

XAML主要代码:
<Grid><Grid.RowDefinitions><RowDefinition Height="*"/><RowDefinition Height="auto"/></Grid.RowDefinitions><TextBox x:Name="textBox" Grid.Row="0"/><Button Content="请选择一个路径" Click="Button_Click" Grid.Row="1" Background="LightBlue" Margin="2,0,2,2" Padding="5" /></Grid>
cs逻辑代码:
using ExifLib;private void Button_Click(object sender, RoutedEventArgs e){// 创建一个选择文件路径的对话框OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Multiselect = false;openFileDialog.CheckFileExists = false;openFileDialog.FileName = "Folder Selection.";openFileDialog.Filter = "Folders|no.files";Dictionary<string, string> dic_pathAndName = new Dictionary<string, string>();if (openFileDialog.ShowDialog() == true){string folderPath = System.IO.Path.GetDirectoryName(openFileDialog.FileName);// 使用 DirectoryInfo 类获取该路径下的所有文件DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);FileInfo[] fileInfos = directoryInfo.GetFiles();// 处理获取到的文件foreach (FileInfo fileInfo in fileInfos){Debug.WriteLine(fileInfo.Name);//dic_pathAndName[System.IO.Path.GetFileNameWithoutExtension(fileInfo.FullName)] = fileInfo.FullName;//key为没有后缀名的文件名dic_pathAndName[fileInfo.Name] = fileInfo.FullName;}}if (dic_pathAndName.Count == 0) return;foreach (var dic in dic_pathAndName){Debug.WriteLine($"{dic.Key}: {getImageExifInfo(dic.Value)}");textBox.AppendText($"{dic.Key}, {getImageExifInfo(dic.Value)}\n");}}string getImageExifInfo(string path){if (!File.Exists(path)) return "";string res = "";try{using (ExifReader reader = new ExifReader(path)){// 相机制造商if (reader.GetTagValue(ExifTags.Make, out string make))Debug.WriteLine("相机制造商: " + make);// 相机型号if (reader.GetTagValue(ExifTags.Model, out string model))Debug.WriteLine("相机型号: " + model);// 光圈if (reader.GetTagValue(ExifTags.FNumber, out double fNumber)){var fNumberFraction = FractionFromDouble(fNumber);Debug.WriteLine("光圈: F/" + fNumber);}string time = "";// 快门速度if (reader.GetTagValue(ExifTags.ExposureTime, out double exposureTime)){var exposureTimeFraction = FractionFromDouble(exposureTime);time = exposureTimeFraction.Item1 + "/" + exposureTimeFraction.Item2;}// ISOif (reader.GetTagValue(ExifTags.ISOSpeedRatings, out ushort isoSpeedRatings))Debug.WriteLine("ISO: " + isoSpeedRatings); 曝光时间//if (reader.GetTagValue(ExifTags.ExposureTime, out double exposureTime))// Debug.WriteLine("曝光时间: " + exposureTime.ToString("0.##") + " s");// 焦距if (reader.GetTagValue(ExifTags.FocalLength, out double focalLength))Debug.WriteLine("焦距: " + focalLength.ToString("0.##") + " mm");res = $"{model} f/{fNumber} {time}s ISO-{isoSpeedRatings} {focalLength}mm";}}catch (Exception e){}return res;}private Tuple<int, int> FractionFromDouble(double value, double error = 0.0001){int denominator = 1;while (Math.Abs(value * denominator - Math.Round(value * denominator)) > error)denominator++;return Tuple.Create((int)Math.Round(value * denominator), denominator);}
以上代码直接复制、拷贝走,然后可以根据自己的需求输出想要的图像参数信息,并随意定义文本格式,爽歪歪。
相关文章:
c#使用ExifLib库提取图像的相机型号、光圈、快门、iso、曝光时间、焦距信息等EXIF信息
近期公司组织了书画摄影比赛,本人作为摄影爱好者,平时也会拍些照片,这次比赛当然不能错过。为了提高获奖概率,选了19张图像作为参赛作品。但是,摄影作品要提交图像的光圈、曝光时间等参数。一两张还可以通过电脑自带软…...
C++入门05—指针
1. 指针的基本概念 指针的作用: 可以通过指针间接访问内存 内存编号是从0开始记录的,一般用十六进制数字表示 可以利用指针变量保存地址 2. 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名; 示例: …...
Go学习第十六章——Gin文件上传与下载
Go web框架——Gin文件上传与下载 1. 文件上传1.1 入门案例(单文件)1.2 服务端保存文件的几种方式SaveUploadedFileCreateCopy 1.3 读取上传的文件1.4 多文件上传 2. 文件下载2.1 快速入门2.2 前后端模式下的文件下载2.3 中文乱码问题 1. 文件上传 1.1 …...
2.MySQL的调控按钮——启动选项和系统变量
2.MySQL的调控按钮——启动选项和系统变量 1.启动选项和配置文件1.1 在命令行上使用选项1.2 配置文件中使用选项1.2.1 配置文件路径1.2.2 配置文件的内容1.2.3 特定 MySQL 版本的专用选项组1.2.4 配置文件的优先级1.2.5 同一个配置文件中多个组的优先级1.2.6 defaults-file 的使…...
故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断
文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断 模型描述 卷积神经网络(convolutional neural network)是具有局部连接、权重共享等特性的深层前馈神经网络,最早主要是用来处理图像信息。 相比于全…...
qt高精度定时器的使用停止线程应用
##线程停止 //线程停止应用 public: explicit WorkerThread(QObject *parent 0) :QThread(parent), m_bStopped(false){qDebug() << "Worker Thread : " << QThread::currentThreadId();}~WorkerThread(){stop();quit();wait();}void stop() {qDebug()…...
Spring Boot Actuator 介绍
Spring Boot Actuator是什么 Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理Spring Boot 应用。 这个模块是一个采集应用内部信息暴露给外部的模块&…...
【MATLAB】安装Psychtoolbox
目录 一、下载Psychtoolbox工具包 1. 一个是这个ZTP文件 2. 分别下载 Subversion 1.7.x command-line client 和 gstreamer.freedesktop.org 二、解压工具包,保存至同一文件 三、安装到matlab 1. 安装psychtoolbox 2. 检查是否安装成功 一、下载Psychtoolbox…...
【Python机器学习】零基础掌握GradientBoostingClassifier集成学习
什么能有效地解决分类问题,特别是在数据复杂、特征多样的情况下? 面对这个问题,许多人可能会想到复杂的神经网络或深度学习方法。然而,有一种称为“梯度提升分类器”(Gradient Boosting Classifier)的算法,以其高准确度、灵活性和易用性赢得了大量用户的青睐。 假设在…...
RFNet模型数据集采集处理流程
文章目录 cityscapes数据集内容如何标注数据得到标签图片 cityscapes数据集内容 训练模型的时候下载了cityscapes里的disparity、gtFine和leftImg8bit。 共5000张图片。2975张训练,500张验证,1525test。每个目录下都有train、test和val的子目录,这些子…...
sql-50练习题6-10
sql练习题6-10题 前言数据库表结构介绍学生表课程表成绩表教师表 0-6 查询"李"姓老师的数量0-7 查询学过"李四"老师授课的同学的信息0-8 查询没学过"李四"老师授课的同学的信息0-9 查询学过编号为"01"并且也学过编号为"02"的…...
【刷题宝典NO.1】
Nim游戏 https://leetcode.cn/problems/nim-game/description/ 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人…...
如何在深度学习领域取得个人的成功
要在深度学习领域取得个人的成功,可以考虑以下建议: 学习深度学习的基础知识:首先,建立坚实的深度学习基础知识是非常重要的。你可以学习深度学习的基本概念、神经网络的原理、常用的深度学习框架(如TensorFlow、PyTor…...
数据结构【DS】B树
m阶B树的核心特性: Q:根节点的子树数范围是多少?关键字数的范围是多少? A:根节点的子树数∈[2, m],关键字数∈[1, m-1]。 Q:其他结点的子树数范围是多少?关键字数范围是多少? Q:对任…...
Chatgpt网页版根据关键词自动批量写原创文章软件【可多开自动登录切换gpt账号】
Chatgpt网页版根据关键词自动批量写原创文章软件介绍: 1、需要放入GPT账号和密码放入在账号库.txt里,可以放入多组账号密码,账号切换轮流使用。 2、可以自定义回答指令,也可多个回答指令随机切换。 3、可以给关键词加双标题&…...
研发效能认证学员作品:快速进行持续集成应用实践丨IDCF
作者:赖嘉明 研发效能(DevOps)工程师认证学员 随着数字化转型的推进及市场竞争的加剧,越来越多的企业也意识到持续集成的重要性。 而持续集成作为一种先进的软件开发实践和工具链,可以帮助企业实现自动化构建、集成和…...
中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程
中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程 学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程中用正确的学习方法 可以达到事半…...
2024年最新水果音乐制作软件FL Studio21需要多少钱呢?
水果,全称Fruity Loop Studio,简称FL Studio。是一款全能的音乐制作软件,经过二十多年的演化更迭,其各项功能非常的先进。其开创性的Pat\song模式,也为初学者的学习提供了便利。那么水果音乐制作软件FL Studio21需要多…...
当生成式AI遇到业务流程管理,大语言模型正在变革BPM
生成式AI对各领域有很大影响,一个方面在于它改变了很多固有业务的工作流。 工作流(Workflow)是业务流程的一种实现方式,一个业务流程往往包含多个工作流范式以及相关的数据、组织和系统。 因此,提及工作流必然离不开业…...
Kotlin数据流概览
文章目录 一 什么是数据流二 创建数据流三 修改数据流四 从数据流中进行收集五 数据流捕获异常六 在不同 CoroutineContext 中执行七 Jetpack 库中的数据流八 将基于回调的 API 转换为数据流 一 什么是数据流 数据流以协程为基础构建,可提供多个值。从概念上来讲&a…...
DocHub二次开发指南:自定义功能扩展与API集成
DocHub二次开发指南:自定义功能扩展与API集成 【免费下载链接】DocHub 参考百度文库,使用Beego(Golang)开发的开源文库系统 项目地址: https://gitcode.com/gh_mirrors/do/DocHub DocHub是基于Beego框架(Golang…...
开源字体完全指南:免费商用与跨平台优化实践
开源字体完全指南:免费商用与跨平台优化实践 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在当今数字化设计领域,选择合适的字体不仅关乎视觉呈现,…...
mPLUG-Owl3-2B多模态推理优化教程:FP16加载+SDPA注意力提速实测
mPLUG-Owl3-2B多模态推理优化教程:FP16加载SDPA注意力提速实测 1. 开篇:为什么需要优化多模态推理? 如果你尝试过在个人电脑上运行多模态AI模型,很可能遇到过这些问题:显存不足导致程序崩溃、推理速度慢得让人着急、…...
OpenClaw安全防护:Phi-3-mini操作权限管控方案
OpenClaw安全防护:Phi-3-mini操作权限管控方案 1. 为什么需要OpenClaw安全防护 上周我在调试一个自动化文档整理任务时,差点酿成大错。当时OpenClaw连接的Phi-3-mini模型误解了我的指令,试图删除整个工作目录下的文件。虽然及时终止了进程&…...
AI能力已经成为2026年的分水岭:2026年企业如何选对人力资源管理平台
HR SaaS系统是基于云端部署的人力资源管理软件,帮助企业实现招聘、人事、绩效、薪酬等HR业务的数字化管理。2026年的HR SaaS已经从传统的流程工具进化为AI驱动的智能管理平台,能够自动处理简历筛选、智能推荐人才、生成绩效面谈纪要等复杂任务࿰…...
项目介绍 MATLAB实现基于概率路图法(PRM)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码) 专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持
MATLAB实现基于概率路图法(PRM)进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解) 随着无人机技术的快速发展&…...
几种因网络波动导致应用与数据库操作异常的现象
文章目录环境文档用途详细信息环境 系统平台:银河麒麟 (X86_64) 版本:4.5.8 文档用途 介绍几种因网络波动导致应用与数据库操作异常的现象。 详细信息 网络超时相关 应用端常见的连接超时相关报错信息,如&#x…...
OpenClaw备份与恢复:Kimi-VL-A3B-Thinking配置的安全迁移
OpenClaw备份与恢复:Kimi-VL-A3B-Thinking配置的安全迁移 1. 为什么需要关注OpenClaw配置备份 上周我的开发机突然硬盘故障,导致辛苦配置了两个月的OpenClaw环境全部丢失。最痛心的是那些精心调试的Kimi-VL-A3B-Thinking模型参数和对接配置——它们就像…...
Halcon拼图算子tile_images_offset实战:从图像裁切到精准拼接
1. 认识tile_images_offset算子 第一次接触Halcon的tile_images_offset算子时,我正面临一个棘手的工业检测项目。客户需要将多个摄像头拍摄的电路板局部图像拼接成完整视图,传统手动拼接方式效率低下且误差大。这个算子就像及时雨,完美解决了…...
从华为实践学IPD:手把手教你写高通过率的Charter文档
华为IPD方法论实战:打造高价值Charter文档的7个关键步骤 在科技企业的研发管理领域,一份优秀的Charter文档往往决定着数千万甚至上亿研发投入的成败。华为IPD(集成产品开发)体系中的Charter开发流程,被全球众多科技企业…...
