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

posted @ 2020-08-26 11:34  ATtuing  阅读(763)  评论(0编辑  收藏  举报