前两天利用ISaveAs实现了单张栅格影像的格式转换,具体见ArcEngine栅格数据格式转换(单张)。但是今天发现了一个问题,在保存为GIF格式时一直报错,用CanSaveAs测试了一下,显示GIF是可以支持的格式,具体是为什么出错我现在也没找到原因。不过今天用ISaveAs对多张栅格影像进行格式转换的保存时意外发现居然可以保存为GIF。所以我比较了一下两者的不同之处。
单张影像格式转换
IRasterLayer pRasterLayer = layer as IRasterLayer;
IDataLayer pDataLayer = pRasterLayer as IDataLayer;
IRaster pRaster = pRasterLayer.Raster;
IWorkspaceFactory pWKSF = new RasterWorkspaceFactoryClass();
IWorkspace pWorkspace = pWKSF.OpenFromFile(Filepath, 0);
ISaveAs pSaveAs = pRaster as ISaveAs;
pSaveAs.SaveAs(System.IO.Path.GetFileName(pFileName)+"."+format, pWorkspace, format);
多张影像格式转换
IWorkspaceFactory pWKSF = new RasterWorkspaceFactoryClass();
IWorkspace saveWorkspace = pWKSF.OpenFromFile(pFilePath, 0);
IWorkspace pWorkspace = pWKSF.OpenFromFile(pPath, 0);
IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;
IRasterDataset pRasterDataset;
for (int i = 0; i < allFileNames.Count; i++ )
{
string pFileName = allFileNames[i];//完整路径名(含文件名和后缀名)
string pName = System.IO.Path.GetFileName(pFileName);
pRasterDataset = pRasterWorkspace.OpenRasterDataset(pName);
IRaster pRaster = pRasterDataset.CreateDefaultRaster();
ISaveAs pSaveAs = pRaster as ISaveAs;
pSaveAs.SaveAs(System.IO.Path.GetFileNameWithoutExtension(pFileName) + "." + format, saveWorkspace, format);
}
单张影像格式转换的实现思路是:首先获取图层,再转换为栅格图层,从而获取其中的栅格数据,最后对该栅格数据进行SaveAs为另一格式。
多张影响格式转换的实现思路是:创建工作空间和栅格数据集,从路径打开栅格文件到栅格数据集,然后再根据数据集创建栅格数据,最后同样使用SavaAs对栅格数据进行另一格式存储。
可以看到,上述两种转换都用到了SaveAs,而且都是SaveAs是直接对Raster进行操作的,区别在于:前者通过已存在图层获取Raster;后者通过创建RasterDataset打开栅格文件,再创建Raster。也就是说,Raster的来源是否经过了RasterDataset,这是我所能找到明显的区别。
通过查看SaveAs的定义:
IDataset SaveAs(string Name, IWorkspace Workspace, string Format);
SaveAs是定义为IDataset的,那么这是不是意味着如果没有经过Dataset这一过程,最后某些格式的栅格数据就不能成功转换呢?我也还在寻找答案。
更新:
刚刚打开代码发现自己被打脸了,昨天明明可以转换成为GIF格式的现在又出错了,我也不知道发生了什么。。。所以以上只能说明是两种Raster的获取方式不同,至于GIF为什么转换失败,暂时无解