ArcEngine對矢量數據進行風格化實在是得心應手,同樣的對於柵格圖像也能進行風格化!以前沒接觸過,今天正好需要,做出了柵格圖像的渲染!下面實現的思路:
1.定義渲染的一系列接口
2.判斷圖像是否建立了直方圖,如果沒有則進行創建。
3.定義顏色序列,為渲染提供渲染的方案。
4.調用Render方法進行渲染。
下面是代碼:有兩個方法,一個是加載柵格數據,一個是進行渲染,接着在事件里面調用方法,實現圖像渲染!
///
/// 柵格分類專題圖
///
/// 柵格圖層
public static void funColorForRaster_Classify(IRasterLayer pRasterLayer)
{
IRasterClassifyColorRampRenderer pRClassRend = new RasterClassifyColorRampRenderer() as IRasterClassifyColorRampRenderer;
IRasterRenderer pRRend = pRClassRend as IRasterRenderer;
IRaster pRaster = pRasterLayer.Raster;
IRasterBandCollection pRBandCol = pRaster as IRasterBandCollection;
IRasterBand pRBand = pRBandCol.Item(0);
if (pRBand.Histogram == null)
{
pRBand.ComputeStatsAndHist();
}
pRRend.Raster = pRaster;
pRClassRend.ClassCount = 10;
pRRend.Update();
IRgbColor pFromColor = new RgbColor() as IRgbColor;
pFromColor.Red = 255;
pFromColor.Green = 0;
pFromColor.Blue = 0;
IRgbColor pToColor = new RgbColor() as IRgbColor;
pToColor.Red = 0;
pToColor.Green = 0;
pToColor.Blue = 255;
IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRamp() as IAlgorithmicColorRamp;
colorRamp.Size = 10;
colorRamp.FromColor = pFromColor;
colorRamp.ToColor = pToColor;
bool createColorRamp;
colorRamp.CreateRamp(out createColorRamp);
IFillSymbol fillSymbol = new SimpleFillSymbol() as IFillSymbol;
for (int i = 0; i < pRClassRend.ClassCount; i++)
{
fillSymbol.Color = colorRamp.get_Color(i);
pRClassRend.set_Symbol(i, fillSymbol as ISymbol);
pRClassRend.set_Label(i, pRClassRend.get_Break(i).ToString("0.00"));
}
pRasterLayer.Renderer = pRRend;
}
///
/// 打開遙感圖像
///
/// 圖像的地址
/// IRasterLayer
private IRasterLayer OpenImage(string imagePath)
{
string ws = Path.GetDirectoryName(imagePath);
string fbs = Path.GetFileName(imagePath);
IWorkspaceFactory pWork = new RasterWorkspaceFactory();
IRasterWorkspace pRasterWs = pWork.OpenFromFile(ws,0) as IRasterWorkspace;
IRasterDataset pRasterDataset = pRasterWs.OpenRasterDataset(fbs);
IRasterLayer pRasterLayer = new RasterLayer() as IRasterLayer;
pRasterLayer.CreateFromDataset(pRasterDataset);
return pRasterLayer;
}
事件的邏輯:
axMapControl1.Map.AddLayer(OpenImage(filePath));
axMapControl1.ActiveView.Refresh();
funColorForRaster_Classify(axMapControl1.get_layer(0) as IRasterLayer);//only one RasterLayer
axMapControl1.Activeview.Refresh();
下面是渲染前后的效果圖: