문제

몇 개의 이미지를 하나의 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! 

그리고 그것은 상당히 낮은 추정치입니다.

사진을 적게로드하거나 실제 썸네일 솔루션을 시도하는 것을 고려할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top