AnsweredAssumed Answered

IpixelBlock3 Error in ArcObject for C# code

Question asked by rainrain3 on Dec 19, 2019
Latest reply on Dec 31, 2019 by rainrain3

Hi everyone in ESRI community!

 

I have an code below utilized IPixelBlock3. however it was an older ESRI 9.3 version i believe. I do not know why the pixel block in the final array does not take set value any other than SByte. But my data needs to be Byte. The legitimate range of my pixel values extends outside the range of sbyte . It seems like something upstream in how pixeldata0 is declared or initialized from pblock_03, that passed to the setvalue call are causing it to only want an sbyte. i Do  not know if IPixelBlock3 got changed in ESRI 10.5 version. the code are as below if any body can help to see and help me out?

the error is happening at the end of the scripts where i have comments.

```

 


System.Array pixelDatao;
DateTime dt1 = DateTime.Now;
tspre = dt1 - dt0;

for (int jtile = 0; jtile < nytiles; jtile++)
{
for (int itile = 0; itile < nxtiles; itile++)
{

// have we gone into raster 2 area yet, or have finished with it

if ((ytile * (jtile + 1) > yoff1) && (ytile * jtile < (nrowo - yoff2)))
{
if ((xtile * (itile + 1) > xoff1) && (xtile * itile < (ncolo - xoff2)))
{
DateTime dt00 = DateTime.Now;
int xpt = itile * xtile;
int ypt = jtile * ytile;
tlco.SetCoords(xpt, ypt);
rRastero.Read(tlco, pBlocko);
// Get target pixeldata array
IPixelBlock3 pBlocko_3 = (IPixelBlock3)pBlocko;
pixelDatao = (System.Array)pBlocko_3.get_PixelDataByRef(0);
int xpt2 = xtile * itile - xoff1;
int ypt2 = ytile * jtile - yoff1;
if (ypt2 < 0) ypt2 = 0;
if (xpt2 < 0) xpt2 = 0;

tlc2.SetCoords(xpt2, ypt2);

rRaster2.Read(tlc2, pBlock2);
// Get target pixel data array
IPixelBlock3 pBlock2_3 = (IPixelBlock3)pBlock2;
// pixelData2 = (System.Array)pBlock2_3.get_PixelData(0);


DateTime dt01 = DateTime.Now;
tsread = tsread + (dt01 - dt00);

//loop through each pixel in the pixelblock and do calculation

for (int y = 0; y < pBlocko_3.Height; y++)
{
for (int x = 0; x < pBlocko_3.Width; x++)
{
// check to see if it's a valid data point
object oval1 = pBlocko_3.GetVal(0, x, y);
object oval2 = pBlock2_3.GetVal(0, x, y);
object oval3 = null;
//object val3 = null;
if (oval1 != null)
{
// access buffers from cutnodes might stretch beyond county buffer zone
if (xpt + x >= xoff1 && xpt + x < ncolo - xoff2 &&
ypt + y >= yoff1 && ypt + y < nrowo - yoff2)
{
int x2 = xpt + x - xoff1 - xpt2;
int y2 = ypt + y - yoff1 - ypt2;
//object oval2 = pBlock2_3.GetVal(0, x2, y2);
if (oval2 != null)
{
int val1 = Convert.ToByte(oval1);
int val2 = Convert.ToByte(oval2);
int val3 = accval[val2] + val1;
oval3 = Convert.ToByte(val3);
pixelDatao.SetValue(oval3, x, y);// this is where the error is (oval3 need to be byte, however PixelDatao is only taken SByte , i tried to change the above scripts, but somehow pixelDatao just Sbyte. i want it to be Byte)

}
}

}
}
pBlocko_3.set_PixelData(0, pixelDatao);
DateTime dt02 = DateTime.Now;
tsup = tsup + (dt02 - dt01);
rRastero.Write(tlco, (IPixelBlock)pBlocko_3);
DateTime dt03 = DateTime.Now;
tswrite = tswrite + (dt03 - dt02);



```

Outcomes