1

いくつかの画像を 1 つの画像ボックスにロードしようとすると、メモリ不足の問題が発生します。

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`
4

3 に答える 3

1

ピクチャ ボックスは、配置したビットマップへの参照を内部的に保持します。ピクチャ ボックスを取り除かない限り、ロードしたすべてのビットマップへの参照が保持されます。

于 2010-03-15T19:01:29.343 に答える
1
if (Image.FromFile(imageFile) != null)
{
    Image.FromFile(imageFile).Dispose();
}

悪い。ファイルから画像をロードし、結果がnullかどうかを確認してから、新しい結果に再度ロードして、破棄できるようにします。後半はばかげていますが、害はありません。ただし、最初の部分は、結果Imageが適切に破棄されないためです (GC が収集した場合、型のファイナライザーImage管理されていないリソースを破棄する必要がありますが、これに依存するのは賢明ではありません)。

ちなみに、Image.FromFile二度と戻りませんnull。画像を読み取れない場合は、OutOfMemoryException.

elseブロックがなく、ブロック内で意味のあることは何も行われていないため、コードも何もしていないように見えますif

私の推測ではOutOfMemoryException、そのディレクトリ内の 1 つ以上のファイルが、破損した、またはサポートされていない画像形式で保存されているか、まったく画像ではないという事実から来ていると思います。

のコードを次のように置き換えてみてください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
于 2010-03-15T18:46:16.833 に答える
0

ディスクに保存されている画像の種類に関係なく、画像を開いて表示すると、画像はビットマップになり、表示されるピクセルごとに 4 バイトが必要になることを考慮する必要があります。

あなたのコードは、サムネイル操作の試みを示唆しているようです。実際には、70 個のファイルをメモリにロードしていますが、表示サイズに関係なく、メモリ内では非常に大きくなります。

たとえば、32 ビットの色深度で 70 個の jpeg があり、サイズが 1920x1080 ピクセルであるとします。その多くの画像を一度にロードするためのメモリ要件は次のとおりです。

 70 pics x 1920 pixels x 1080 pixels x 4 bytes/pixel = 580,608,000 bytes! 

そして、それはかなり低い見積もりです。

読み込む画像の数を減らすか、実際のサムネイル ソリューションを試すことを検討してください。

于 2010-03-15T19:01:22.150 に答える