質問
している問題の記憶がようにしている負荷の少数の画像を一つの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に収集しました個人情報については、finalizerの 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
他のヒント
ピクチャボックスは、内部的にあなたがそれに置くビットマップへの参照を保持しています。あなたがピクチャボックスを取り除く場合を除き、それはあなたがそれにロードごとにビットマップへの参照を保持しています。
何か
あなたのコードでは、サムネイル操作の試みを示唆しているようです。あなたは、メモリに実際の負荷で70個のファイルであり、表示サイズに関係なく、メモリに彼らは非常に大きくなります。
たとえばあなたが32ビットの色深度で70枚のJPEGファイルを持っていると言うと、サイズが1920×1080ピクセルをしましょう。すべてを一度に、その多くの画像をロードするためにあなたのメモリ要件があります:
70 pics x 1920 pixels x 1080 pixels x 4 bytes/pixel = 580,608,000 bytes!
そして、それはかなり低い見積もりです。
あなたは多くの少数の写真をロードしたり、実際のサムネイルソリューションをしようとして検討することもできます。