zoukankan      html  css  js  c++  java
  • 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 + "
    ";
                        }
                    }
                    catch (Exception ex)
                    {
    
                        delpathstrings += item + "----" + ex.Message + "
    ";
                    }
                }
    

    编译好的程序下载

    链接:https://pan.baidu.com/s/1tUntTGD2L0QTkmQ2Ns7FrQ
    提取码:l2c6

  • 相关阅读:
    fiddler---Fiddler模拟接口数据(mock)
    Intellij IDEA gradle项目目录介绍
    Windows netstat 查看端口、进程占用
    SpringMVC和spring常见面试题总结
    mybatis一级缓存二级缓存
    Mybatis常见面试题总结
    Spring容器
    深入理解JVM类加载机制
    理解Spring框架中Bean的5个作用域
    编程语言的分类与关系
  • 原文地址:https://www.cnblogs.com/ATtuing/p/13564107.html
Copyright © 2011-2022 走看看