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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章