题
我有出当我试图负载几个图像转换成一个PictureBox的存储器的问题。
public void button2_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.ShowDialog();
string selected = dialog.SelectedPath;
string[] imageFileList = Directory.GetFiles(selected);
int iCtr = 0,zCtr = 0;
foreach(string imageFile in imageFileList)
{
if (Image.FromFile(imageFile) != null)
{
Image.FromFile(imageFile).Dispose();
}
PictureBox eachPictureBox = new PictureBox();
eachPictureBox.Size = new Size(100,100);
// if (iCtr % 8 == 0)
//{
// zCtr++;
// iCtr = 0;
//}
eachPictureBox.Location = new Point(iCtr * 100 + 1, 1);
eachPictureBox.Image = Image.FromFile(imageFile);
iCtr++;
panel1.Controls.Add(eachPictureBox);
}
}`enter code here`
解决方案
if (Image.FromFile(imageFile) != null) { Image.FromFile(imageFile).Dispose(); }
坏。你从文件加载图像,检查,看看结果是空......然后再装载到一个新的结果,这样就可以处理它。而后者部分傻,它不是有害的。所述第一部分是,然而,所得到的Image
从不正确的处理(如果/当GC收集它,在Image
型终结应处置的非托管资源的,但是这不是一个明智的事情依靠)。
顺便提及,Image.FromFile
将永远不会返回null
。如果它不能读取的图像,那么它会抛出OutOfMemoryException
。
中的代码也显得无可奈何,因为没有else
块并没有什么有意义的是在if
块完成。
我的猜测是,你OutOfMemoryException
是从一个或多个在该目录中的文件存储在一个已损坏的或不支持的图像格式或不是图像在所有的事实来。
尝试使用此替换在foreach
的代码:
try
{
Image image = Image.FromFile(imageFile);
PictureBox eachPictureBox = new PictureBox();
eachPictureBox.Size = new Size(100,100);
eachPictureBox.Location = new Point(iCtr * 100 + 1, 1);
eachPictureBox.Image = Image.FromFile(imageFile);
iCtr++;
panel1.Controls.Add(eachPictureBox);
}
catch(OutOfMemoryException) { } // skip the file
其他提示
在图片框的内部保存到在其放置位图的参考。除非你摆脱图片框,它所持有的每一个加载到它的位图的参考。
东西,你必须考虑到,无论存储在磁盘上的画面的类型,当打开它用于显示的图像将成为位图,其每显示的像素4个字节。
您的代码似乎显示在缩略图操作的尝试。你实际上装载70个文件到内存中,无论显示尺寸,内存,他们会非常大。
例如,让我们假设你有32位在颜色深度70个JPEG文件,并说在尺寸1920×1080像素。您的存储器需求来加载许多图像一次全部然后是:
70 pics x 1920 pixels x 1080 pixels x 4 bytes/pixel = 580,608,000 bytes!
,这是一个相当低的估计。
您可以考虑装少很多图片或者尝试一个真正的缩图的解决方案。
不隶属于 StackOverflow