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

<Grid> <Grid.RowDefinitions> <RowDefinition Height*/> <RowDefinition Heightauto/> </Grid.RowDefinitions> <TextBox x:NametextBox Grid.Row0/> <Button Content请选择一个路径 ClickButton_Click Grid.Row1 BackgroundLightBlue Margin2,0,2,2 Padding5 /> </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; } // ISO if (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); }
以上代码直接复制、拷贝走然后可以根据自己的需求输出想要的图像参数信息并随意定义文本格式爽歪歪。

标签: