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' 错误)。
- 首先我 return 来自第一个对象的列表,
- 然后复制到第二个对象中,
- 然后销毁第一个对象。
当我检查 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);
问题就解决了。
我正在从相机拍摄位图图像并将它们存储在列表<位图>中。
在同一个 class 中,我可以直接从列表中设置 pictureBox 图像,例如:
pictureBox1.Image = imagesToReturn[0];
其中 imagesToReturn 是一个列表<位图>。
当我从另一个 class 调用此方法时出现问题。 (抛出 'invalid parameter' 错误)。
- 首先我 return 来自第一个对象的列表,
- 然后复制到第二个对象中,
- 然后销毁第一个对象。
当我检查 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);
问题就解决了。