Excel催化剂在文件处理方面,功能做到极致,但其实很大功劳都是引用一些开源社区的轮子库,不敢独占好处,此篇给大家分享下抓取图片的Exif信息的好用的轮子。
此篇对应的Excel催化剂功能实现:第83波-遍历文件夹内文件信息特别是图像、音视频等特有信息 https://www.jianshu.com/p/ad98adc64f0b
当然再次强调,找东西尽量用google,百度是非常低效,找出来的代码,好多也不适用,吐槽下百度最喜欢收录CSDN的文章,只是物以类聚,垃圾对垃圾,广告婊子一个。真要搜索,建议还是加上site:cnblogs.com。
正式介绍主角,图片Exif信息的读取,就靠MetadataExtractor完成,在nuget上直接有。
MetadataExtractor类库
调用方法非常简洁,一句代码完成,其他代码都是用来提取信息,处理字符串、集合之类的。
核心代码如下:
代码语言:javascript复制 IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(filePath);
以上是笔者对Exif感兴趣的内容作的提取,只需linq和正则就可以游刃有余。
代码语言:javascript复制 IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(filePath);
string widthStr = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "Image Width")).FirstOrDefault().Description;
dr[ColNameOfImageWidth] = int.Parse(Regex.Match(widthStr, "\d ").Value);
string heightStr = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "Image Height")).FirstOrDefault().Description;
dr[ColNameOfImageHeight] = int.Parse(Regex.Match(heightStr, "\d ").Value);
if (Path.GetExtension(filePath).ToLower() == ".jpg" || Path.GetExtension(filePath).ToLower() == ".jpeg")
{
var maker = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "Make")).FirstOrDefault(x => x != null);
if (maker != null)
{
dr[ColNameOfMake] = maker.Description;
}
var model = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "Model")).FirstOrDefault(x => x != null);
if (model != null)
{
dr[ColNameOfModel] = model.Description;
}
var picDate = directories.FirstOrDefault(s => s.Name == "Exif SubIFD").Tags.FirstOrDefault(t => t.Name == "Date/Time Original");
if (picDate != null)
{
string str = picDate.Description;
if (!string.IsNullOrEmpty(str))
{
dr[ColNameOfPicDate] = DateTime.Parse(str.Substring(0, 10).Replace(':', '-') str.Substring(10));
}
}
var jingdu = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "GPS Latitude")).FirstOrDefault(x => x != null);
if (jingdu != null)
{
string str = jingdu.Description;
MatchCollection matchCollection = Regex.Matches(str, "\d ");
dr[ColNameOfLatitude] = int.Parse(matchCollection[0].Value) int.Parse(matchCollection[1].Value) / 60.0 int.Parse(matchCollection[1].Value) / 60.0 / 60.0;
}
var weidu = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "GPS Longitude")).FirstOrDefault(x => x != null);
if (weidu != null)
{
string str = weidu.Description;
MatchCollection matchCollection = Regex.Matches(str, "\d ");
dr[ColNameOfLongitude] = int.Parse(matchCollection[0].Value) int.Parse(matchCollection[1].Value) / 60.0 int.Parse(matchCollection[1].Value) / 60.0 / 60.0;
}
var haiba = directories.Where(s => s.Name != "File").Select(k => k.Tags.FirstOrDefault(t => t.Name == "GPS Altitude")).FirstOrDefault(x => x != null);
if (haiba != null)
{
string str = haiba.Description;
dr[ColNameOfAltitude] = Regex.Match(str, "\d ").Value;
}
简单给大家看下Exif读取到的信息。
有价值的信息都存在这些tag里面
jpeg方面的信息
photoshop处理过的信息都保存在内,所以不想让Adobe告的话,最后一步最好把Exif给删除掉,哈哈。
photoshop处理过的信息都保存在内
摄影师想要的信息也都在里面