简体   繁体   中英

NullReferenceException while retrieving RGB-code & adding to array c#

Dear StackOverflow

I am writing an algorythm that creates a "checkerboard image" (imgOutput) from another image (imgInput), like this example.

What it does is checking every pixel of the image (500x500 pixels) one by one and devide the picture in 2500 boxes of 10x10 pixels each. I already wrote the algorythm to calculate the average RGB colors, not to draw the image yet. This is the code:

    public class PixelMatrix
    {
        public int X;
        public int Y;
        public int R;
        public int G;
        public int B;
    }

    public class RGBMatrix
    {
        public int R;
        public int G;
        public int B;
    }

public Bitmap fncRasterize(Bitmap imgInput)
        {


            Bitmap imgOutput = new Bitmap(imgInput, 500, 500);
            imgOutput.Save("test.bmp");
            PixelMatrix[] arrWindows = new PixelMatrix[2500];
            RGBMatrix[] arrRGB = new RGBMatrix[100];

            Graphics gfx = Graphics.FromImage(imgOutput);


            int WindowCount = 1;
            int PixelCount = 1;

            int WindowX;
            int WindowY;

            int PixelX;
            int PixelY;

            int avrgR = 0;
            int avrgG = 0;
            int avrgB = 0;

            int tempcounter = 0;


            for (WindowY = 1; WindowY <= 50; WindowY++)
            {

                for (WindowX = 1; WindowX <= 50; WindowX++)
                {
                    PixelCount = 1;
                    avrgR = 0;

                    for (PixelY = 1;  PixelY <= 10; PixelY++)
                    {
                        for (PixelX = 1; PixelX <= 10; PixelX++)
                        {
                            MessageBox.Show("R:" + imgOutput.GetPixel(1, 1).R + " G:" + imgOutput.GetPixel(1, 1).G + " B:" +imgOutput.GetPixel(1, 1).B);

                            arrRGB[PixelCount].R = (int)imgOutput.GetPixel((WindowX * 10 - 10 + PixelX), (WindowY * 10 - 10 + PixelY)).R;
                            arrRGB[PixelCount].G = (int)imgOutput.GetPixel((WindowX * 10 - 10 + PixelX), (WindowY * 10 - 10 + PixelY)).G;
                            arrRGB[PixelCount].B = (int)imgOutput.GetPixel((WindowX * 10 - 10 + PixelX), (WindowY * 10 - 10 + PixelY)).B;

                            // This is just to test
                            tempcounter = +tempcounter;
                            lblProgress.Text = tempcounter.ToString();
                        }
                    }

                    for (int tempx = 1; tempx <= 100; tempx++)
                    {
                        avrgR = +arrRGB[tempx].R;
                        avrgG = +arrRGB[tempx].G;
                        avrgB = +arrRGB[tempx].B;
                    }
                    arrWindows[WindowCount].R = (avrgR / 100);
                    arrWindows[WindowCount].G = (avrgG / 100);
                    arrWindows[WindowCount].B = (avrgB / 100);

                    WindowCount = +1;

                }
            }




            return imgOutput;

        }

Now when the algorythm starts running I get a NullReferenceException error on this line:

 arrRGB[PixelCount].R = imgOutput.GetPixel(tempR.X, tempR.Y).R;
 arrRGB[PixelCount].G = imgOutput.GetPixel(tempG.X, tempG.Y).G;
 arrRGB[PixelCount].B = imgOutput.GetPixel(tempG.X, tempG.Y).B;

While the line above it (the Messagebox statement) flawlessly returns the RGB values. Could someone please explain to me why this is? This is really frustrating.

You never created the RGBMatrix objects in arrRGB , so the R G and B properties don't exist yet. That's where the NullReferenceException is coming from.

You declare an array that has 100 slots to contain elements of type RGBMatrix.
But you have to create each of these elements and assign an instance to the correct slot before trying to access the property of the instance.

for (PixelX = 1; PixelX <= 10; PixelX++)
{
    MessageBox.Show("R:" + imgOutput.GetPixel(1, 1).R + " G:" + imgOutput.GetPixel(1, 1).G + " B:" +imgOutput.GetPixel(1, 1).B);

    arrRGB[PixelCount] = new RBGMatrix();   // This create the instance

    arrRGB[PixelCount].R = (int).....
    arrRGB[PixelCount].G = (int)....
    arrRGB[PixelCount].B = (int)....

    // This is just to test
    tempcounter = +tempcounter;
    lblProgress.Text = tempcounter.ToString();
}

or the other way

RGBMatrix mx = new new RBGMatrix();   
mx,R = = (int).....
....
arrRGB[PixelCount] = mx;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM