問題緣起
有一次去北京給客戶交航飛影像數據,客戶那邊用一個軟件跑了一下所有的影像發現有幾十個.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