One PictureBox에 멀티 이미지가있는 메모리가 없습니다
-
20-09-2019 - |
문제
몇 개의 이미지를 하나의 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(); }
나쁜. 파일에서 이미지를로드하고 결과가 NULL인지 확인하여 ... 새로운 결과에 다시로드하여 폐기 할 수 있습니다. 후자의 부분은 어리석지 만 해롭지는 않습니다. 그러나 첫 번째 부분은 결과적으로 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가 있고 크기가 1920x1080 픽셀이 있다고 가정 해 봅시다. 한 번에 많은 이미지를로드하려는 메모리 요구 사항은 다음과 같습니다.
70 pics x 1920 pixels x 1080 pixels x 4 bytes/pixel = 580,608,000 bytes!
그리고 그것은 상당히 낮은 추정치입니다.
사진을 적게로드하거나 실제 썸네일 솔루션을 시도하는 것을 고려할 수 있습니다.