c# : setting an image to pictureBox from List<Bitmap> in another class gives following error: Parameter is not valid

c# : setting an image to pictureBox from List<Bitmap> in another class gives following error: Parameter is not valid

我正在从相机拍摄位图图像并将它们存储在列表<位图>中。

在同一个 class 中,我可以直接从列表中设置 pictureBox 图像,例如:

pictureBox1.Image = imagesToReturn[0];

其中 imagesToReturn 是一个列表<位图>。

当我从另一个 class 调用此方法时出现问题。 (抛出 'invalid parameter' 错误)。

当我检查 returned 列表时,我看到它们 returned 正确(检查下图;[2] 故意为空)。

你们知道可能是什么问题或者我该如何解决这个问题吗? 感谢您的宝贵时间和帮助。

(编辑:长话短说,由于 'invalid parameter' 错误,您在上图中看到的列表无法加载到图片框)

以下是部分代码: 这些在第一个 class 中并且工作完美:

/*These are in the first class and works perfectly.*/
 public static List<Bitmap> ImagesToReturn = new List<Bitmap>();
 public static void updateThumbnails(Bitmap img, int* pictureBoxIndex)
    {
        switch (*pictureBoxIndex)
        {
            case 1:
                ImagesToReturn[0] = img;
                pictureBox2.Image = ImagesToReturn[0];//so that I know they are stored correctly.
                pictureBox2.Refresh();
                break;
            case 2:
                ImagesToReturn[1] = img;
                pictureBox3.Image = ImagesToReturn[1];
                pictureBox3.Refresh();
                break;
            case 3:
                ImagesToReturn[2] = img;
                pictureBox4.Image = ImagesToReturn[2];
                pictureBox4.Refresh();
                break;
            case 4:
                ImagesToReturn[3] = img;
                pictureBox5.Image = ImagesToReturn[3];
                pictureBox5.Refresh();
                break;
            default:
                break;
        }
        *pictureBoxIndex = 0;

        img.Dispose();
    }

public List<Bitmap> returnCapturedImageList()
    {
        return ImagesToReturn;
    }


//Done button. Terminates the processes.
private void button2_Click(object sender, EventArgs e) 

    {
        keepRunning = false; // in order to stop straming
        this.DialogResult = DialogResult.OK;

    }

这些在第二个 class:

public static List<Bitmap> returnedImages = new List<Bitmap>();
private void button1_Click(object sender, EventArgs e)
    {
        WindowsFormsApplication6.Form2 cameraModule = new WindowsFormsApplication6.Form2();            

        var result = cameraModule.ShowDialog();

        if (result == DialogResult.OK)
        {
             returnedImages = cameraModule.returnCapturedImageList()

            pictureBox1.Image = returnedImages[0]; //ERROR is thrown here!
            pictureBox1.Refresh();

            cameraModule.DialogResult = DialogResult.Cancel;
            cameraModule.Close();

        }
        returnedImages.Clear();
    }

感谢user6144226 and LarsTech,问题已解决。他们居然指出了错误。

 ImagesToReturn[0] = img; /*not copying or cloning*/
 ImagesToReturn[1] = img;
 ImagesToReturn[2] = img;
 ImagesToReturn[3] = img;

上面的语句没有将图像复制到列表中。它指向 'img'。换句话说,当我使用以下命令处理 'img' 时:

 img.Dispose();

"ImagesToReturn[n]" 指向的内存已被释放。

正确的做法如下:

ImagesToReturn[0] = new Bitmap(img); /*copying*/
ImagesToReturn[1] = new Bitmap(img);
ImagesToReturn[2] = new Bitmap(img);

问题就解决了。