c#调用GDAL判断图片文件是否损坏
问题缘起
有一次去北京给客户交航飞影像数据,客户那边用一个软件跑了一下所有的影像发现有几十个.tif文件打不开,这下把我们急的,就差最后一步还是出错了,我们也没没带原始数据盘,没办法还的回家拿数据再来一次。这时候同事就想能不能自己写一个程序看一下是否影像有损毁,我分析了一下,大体上有三种解决方案。
通过文件头文件判断
这个方案否定了,通过文件头不能真正的判断是否损坏,而且不同格式的文件头还不一样。
通过代码加载图片
这个方案也否定了,超过几G的大文件会出现内存过载的情况。
使用专业的GDAL图像库进行加载
GDAL使用c++写的跨平台的开源栅格空间数据转换库(也支持矢量数据),很多企业级的GIS软件例如arcgis,以及开源的QGIS读取影像都使用这个库。我们只需使用GDAL加载数据就可以判断文件是否加载正常即可。
c#调用GDAL
c#引用GDAL
解决初始化出现异常:OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。
使用nuget方式引用GDAL就可以解决上面的异常
install-package GDAL
install-package GDAL.Native
GDAL初始化
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
Gdal.AllRegister();
判断影像是否损坏
通过打开文件,判断返回的OSGeo.GDAL.Dataset 是否为空,即可判断是否损坏。
string[] filedir = Directory.GetFiles(textBox16.Text, "*" + textBox1.Text, SearchOption.AllDirectories);
string delpathstrings = "";
foreach (string item in filedir)
{
try
{
OSGeo.GDAL.Dataset dataset = OSGeo.GDAL.Gdal.Open(item, OSGeo.GDAL.Access.GA_ReadOnly);
if (dataset == null)
{
delpathstrings += item + "\r\n";
}
}
catch (Exception ex)
{
delpathstrings += item + "----" + ex.Message + "\r\n";
}
}
编译好的程序下载
链接:https://pan.baidu.com/s/1tUntTGD2L0QTkmQ2Ns7FrQ
提取码:l2c6