C# 快速获取图片大小以及分辨率(使用metadata-extractor)
官网:metadata-extractor官网
安装:PM> Install-Package MetadataExtractor
注:该控件功能很多,能获取图片的基本所有信息,且速度很快,这里只使用了获取照片的大小以及分辨率
由于软件需要频繁读取JPG文件的像素以及分辨率,早期使用Image类,这个就不说了,速度是惨不忍睹。后来使用SOF0段读取,速度快是快了,但是使用一段时间后发现如果PS保存照片的时候基线不对或者其他一些情况会导致读取不出来尺寸,而且分辨率格式不同无法识别(像素/英寸,像素/厘米)。。。。。
。。发现一个问题:JPG格式为连续扫描时,这个提取文件尺寸惨不忍睹,所以又想了个别的办法:https://blog.csdn.net/zxpei/article/details/116651526
使用metadata-extractor:
安装或引用后先 using MetadataExtractor
public static void GetJpgSizeByME(string JpgPath, out Size JpgSize, out float Wpx, out float Hpx)
{
var rmd = ImageMetadataReader.ReadMetadata(JpgPath);
JpgSize = new Size(0, 0);
Wpx = 0;
Hpx = 0;
foreach (var rd in rmd)
{
if (JpgSize.Height > 0 && JpgSize.Width > 0 && Wpx > 0 && Hpx > 0) break;
string units = "";
Tag item = rd.Tags.FirstOrDefault((a) => a.Name == "Resolution Units" || a.Name == "Resolution Unit");//单位,英寸或厘米
if (item != null) units = item.Description.ToLower();
foreach (var tag in rd.Tags)
{
//图片高的标签
if (tag.Name == "Image Height" && JpgSize.Height == 0)
{
JpgSize.Height = int.Parse(Regex.Replace(tag.Description, @"[^0-9]+", ""));
}
//宽片宽的标签
else if (tag.Name == "Image Width" && JpgSize.Width == 0)
{
JpgSize.Width = int.Parse(Regex.Replace(tag.Description, @"[^0-9]+", ""));
}
//水平分辨率
else if (tag.Name == "X Resolution" && Wpx == 0)
{
if (units == "centimetre" || units == "cm")//像素/厘米
{
Wpx = 2.54f * int.Parse(Regex.Replace(tag.Description, @"[^0-9]+", ""));
}
else if (units == "inch")//像素/英寸
{
Wpx = int.Parse(Regex.Replace(tag.Description, @"[^0-9]+", ""));
}
}
//垂直分辨率
else if (tag.Name == "Y Resolution" && Hpx == 0)
{
if (units == "centimetre" || units == "cm")//像素/厘米
{
Hpx = 2.54f * int.Parse(Regex.Replace(tag.Description, @"[^0-9]+", ""));
}
else if (units == "inch")//像素/英寸
{
Hpx = int.Parse(Regex.Replace(tag.Description, @"[^0-9]+", ""));
}
}
}
}
}