About the Create a custom NoData pixel filter Sample
[C#]
NodataFilter.cs
using System; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Geodatabase; namespace CustomNodataFilter { //This sample shows the steps to create a customized pixelfilter //INodataFilter filters out a range of values in a raster to be nodata public interface INodataFilter : IPixelFilter { //IPixelFilter methods new void Filter(IPixelBlock pPixelBlock); new void GetCenterPosition(ref int x, ref int y); new void GetSize(ref int nCols, ref int nRows); //INodataFilter members int MinNodataValue { get; set;} int MaxNodataValue { get; set;} } public class NodataFilter : INodataFilter { public void Filter(IPixelBlock pPixelBlock) { try { IPixelBlock3 pPixelBlock3 = (IPixelBlock3)pPixelBlock; byte[] lookup = new byte[8] { 128, 64, 32, 16, 8, 4, 2, 1 }; //get number of bands int plane = pPixelBlock.Planes; //loop through each band for (int i = 0; i < plane; i++) { //get nodata mask array byte[] outputArray = (byte[])pPixelBlock3.get_NoDataMaskByRef(i); //loop through each pixel in the pixelblock and do calculation for (int x = 0; x < pPixelBlock.Width; x++) { for (int y = 0; y < pPixelBlock.Height; y++) { //get index in the nodata mask byte array int ind = x + y * (pPixelBlock.Width); //get nodata mask byte byte nd = outputArray[ind / 8]; //get pixel value and check if it is nodata object tempVal = pPixelBlock3.GetVal(i, x, y); if (tempVal != null) //not nodata pixel { //convert pixel value to int and compare with nodata range int curVal = Convert.ToInt32(tempVal); if (curVal >= minNodataValue && curVal <= maxNodataValue) { outputArray[ind / 8] = (byte)(nd & ~lookup[ind % 8]); } } } } //set nodata mask array pPixelBlock3.set_NoDataMask(i, outputArray); } } catch (Exception e) { Console.WriteLine(e.Message); } } //implements IPixelFilter:GetCenterPosition public void GetCenterPosition(ref int x, ref int y) { x = 0; y = 0; } //implements IPixelFilter:GetSize public void GetSize(ref int nCols, ref int nRows) { nCols = 0; nRows = 0; } //get/set max range of nodata public int MaxNodataValue { get { return maxNodataValue; } set { maxNodataValue = value; } } //get/set min range of nodata public int MinNodataValue { get { return minNodataValue; } set { minNodataValue = value; } } private int minNodataValue; private int maxNodataValue; } }
[Visual Basic .NET]
NodataFilter.vb
Imports System Imports ESRI.ArcGIS.DataSourcesRaster Imports ESRI.ArcGIS.Geodatabase 'This sample shows the steps to create a customized pixelfilter 'INodataFilter filters out a range of values in a raster to be nodata Public Interface INodataFilter Inherits IPixelFilter 'INodataFilter members Property MinNodataValue() As Integer Property MaxNodataValue() As Integer End Interface Public Class NodataFilter Implements INodataFilter Sub Filter(ByVal pPixelBlock As IPixelBlock) Implements INodataFilter.Filter Dim x As Integer Dim y As Integer Try Dim pPixelBlock3 As IPixelBlock3 = CType(pPixelBlock, IPixelBlock3) Dim lookup() As Byte = New Byte(7) {128, 64, 32, 16, 8, 4, 2, 1} 'get number of bands Dim plane As Integer = pPixelBlock.Planes 'loop through each band Dim i As Integer For i = 0 To plane - 1 'get nodata mask array Dim outputArray() As Byte = CType(pPixelBlock3.NoDataMask(i), Byte()) 'loop through each pixel in the pixelblock and do calculation For y = 0 To pPixelBlock.Height - 1 For x = 0 To pPixelBlock.Width - 1 'get index in the nodata mask byte array Dim ind As Integer = x + y * (pPixelBlock.Width) 'get nodata mask byte Dim nd As Byte = outputArray(ind \ 8) 'get pixel value and check if it is nodata Dim tempVal As Object = pPixelBlock3.GetVal(i, x, y) If Not tempVal Is Nothing Then 'convert pixel value to int and compare with nodata range Dim curVal As Integer = Convert.ToInt32(tempVal) If curVal >= MinNodataValue And curVal <= MaxNodataValue Then outputArray(ind \ 8) = CType((nd - lookup(ind Mod 8)), Byte) End If End If Next Next 'set nodata mask array pPixelBlock3.NoDataMask(i) = outputArray Next Catch e As Exception Console.WriteLine(e.Message) End Try End Sub 'implements IPixelFilter:GetCenterPosition Public Sub GetCenterPosition(ByRef x As Integer, ByRef y As Integer) Implements INodataFilter.GetCenterPosition x = 0 y = 0 End Sub 'implements IPixelFilter:GetSize Public Sub GetSize(ByRef nCols As Integer, ByRef nRows As Integer) Implements INodataFilter.GetSize nCols = 0 nRows = 0 End Sub 'get/set max range of nodata Public Property MaxNodataValue() As Integer Implements INodataFilter.MaxNodataValue Get Return maxNDValue End Get Set(ByVal Value As Integer) maxNDValue = Value End Set End Property 'get/set min range of nodata Public Property MinNodataValue() As Integer Implements INodataFilter.MinNodataValue Get Return minNDValue End Get Set(ByVal Value As Integer) minNDValue = Value End Set End Property Private minNDValue As Integer Private maxNDValue As Integer End Class