IRasterStretch2接口的StretchStats属性的真实面目是什么

这个问题源于制作RGB彩色合成图。仿照ArcMap中的做法,我们发现Arcmap中除了标准差拉伸、直方图均衡化、最大最小值拉伸、直方图匹配等既定的拉伸方法之外,还有最直接的自定义直方图拉伸。在我想实现这个功能的时候,发现最有可能与此相关的接口就是IRasterStretch2,其StretchStats和SpecificationHistogram应该就是与直方图相关的属性。经过测试,问题出现了:

                IRasterRGBRenderer2 m_pRasterRGBRenderer = pRasterLayer.Renderer as IRasterRGBRenderer2;
                IRasterStretch2 pRasterStretch2 = m_pRasterRGBRenderer as IRasterStretch2;
                IArray pArray = pRasterStretch2.SpecificationHistogram;
                IArray pArray2 = pRasterStretch2.StretchStats;

                object obj1 = pArray.get_Element(0);
                object obj2 = pArray2.get_Element(0);

当我们用ArcMap制作好RGB合成图并用自己的程序加载地图后,发现StretchStats和SpecificationHistogram都是IArray类型的接口对象,经过转换,并且进一步探索,发现其元素是一个object类型的对象,其中obj1是null,而obj2有值,但是使用GetType()的得到的信息是System.__ComObject,这下就难住我们了,因为我们无法确认它的真实面目。经过网上搜索,发现这个问题在2011年就有人发过帖子,见:Geographic Informathion System论坛,ESRI ArcGIS Resource论坛。

这两处,应该都是同一个人提的,他问的也是同样的问题:

IRasterStretch2 irs = irrgbr as IRasterStretch2; //irrgbr is of type IRasterRGBRenderer.
IArray ia = irs.StretchStats;
ISomething value = ia.get_Element(0) as ISomething; // What should "ISomething" be?

并且比较糟糕的是居然没有任何答案。为了实现我的功能,就必须解决这个问题。首先我能确定的是,这个object肯定是一个对象,那么它究竟是什么呢?

在这里http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/d/000100000471000000.htm,我看到IArray是一个IAnimationTrack对象,而在http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/d/0001000002r6000000.htm处,我发现它是一个EnumGPNameClass对象,还有很多地方,都有IArray的身影,问题变得似乎复杂了.

既然这里的IArray与直方图有关,那么它肯定是一个键值对组合,最容易想到的是IUniqueValues,很不幸的是在即时窗口里的测试结果是false

obj2 is ESRI.ArcGIS.DataSourcesRaster.IUniqueValues
false

无奈,只好试试其它的。于是我做了如下的测试:

obj2 is ESRI.ArcGIS.DataSourcesRaster.IRaster2
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterBand
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterBandCollection
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterBandColormap
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterCalcStatsHistogram
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterCalcStatsHistogram2
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IRasterCalcUniqueValues
false
obj2 is ESRI.ArcGIS.DataSourcesRaster.IStatsHistogram
true
测试的类型比我想象的要少,最初还想用反射来枚举AE中的所有类,以便探测其类型,没想到的是大概测试了十多个接口,敏感的我就定位到了统计相关的接口,并且找到了IStatsHistogram接口。没有让我失望,Is IStatsHistogram返回了true,这样问题就解决了。既然网上对于这个问题没有任何论述,我就在此罗嗦一下,撰文一篇,以期对后续遇到同样问题的人有所帮助。另外在 ESRI ArcGIS Resource论坛里,我也留下了答案。




 
 
 
 
 
 

你可能感兴趣的:(IRasterStretch2接口的StretchStats属性的真实面目是什么)