带有位图的并行 foreach 内存泄漏
Parallel foreach memory leak with bitmaps
我想 select 多张(在我的例子中是 77 张)图像并将它们转换成其他尺寸和格式。
我制作了一个 Ilist(字符串)listaslika,其中包含来自文件夹的图像名称列表。 tbSelect 是一个包含图像来源文件夹路径的文本框,tbSave 包含将保存图像的文件夹。
现在我想调整所有这些的大小,即使我处理了所有内容,我也有内存泄漏,有什么建议吗?提前致谢。
private void button3_Click(object sender, EventArgs e)
{
int W = Convert.ToInt32(txtW.Text);
int H = Convert.ToInt32(txtH.Text);
Parallel.ForEach(listaslika, slika =>
{
Bitmap bpm = new Bitmap(W, H);
Graphics graphic = Graphics.FromImage(bpm);
img = Image.FromFile(tbSelect.Text + "\" + slika);
graphic.DrawImage(img, 0, 0, W, H);
graphic.Dispose();
img = bpm;
((Button)sender).Enabled = false;
string select = Path.GetFileNameWithoutExtension(slika);
img.Save(tbSave.Text + "\" + select + exten[GetSelecetedIndex()]);
bpm.Dispose();
img.Dispose();
});
我希望它看起来更像:
private void button3_Click(object sender, EventArgs e)
{
int W = Convert.ToInt32(txtW.Text);
int H = Convert.ToInt32(txtH.Text);
Parallel.ForEach(listaslika, slika =>
{
using (Bitmap bmp = new Bitmap(W, H))
{
using (Graphics graphic = Graphics.FromImage(bmp))
{
using (FileStream fs = new FileStream(tbSelect.Text + "\" + slika, System.IO.FileMode.Open))
{
using (Image img = Image.FromStream(fs))
{
graphic.DrawImage(img, 0, 0, W, H);
}
}
}
string select = Path.GetFileNameWithoutExtension(slika);
bmp.Save(tbSave.Text + "\" + select + exten[GetSelecetedIndex()]);
}
});
}
我想 select 多张(在我的例子中是 77 张)图像并将它们转换成其他尺寸和格式。 我制作了一个 Ilist(字符串)listaslika,其中包含来自文件夹的图像名称列表。 tbSelect 是一个包含图像来源文件夹路径的文本框,tbSave 包含将保存图像的文件夹。 现在我想调整所有这些的大小,即使我处理了所有内容,我也有内存泄漏,有什么建议吗?提前致谢。
private void button3_Click(object sender, EventArgs e)
{
int W = Convert.ToInt32(txtW.Text);
int H = Convert.ToInt32(txtH.Text);
Parallel.ForEach(listaslika, slika =>
{
Bitmap bpm = new Bitmap(W, H);
Graphics graphic = Graphics.FromImage(bpm);
img = Image.FromFile(tbSelect.Text + "\" + slika);
graphic.DrawImage(img, 0, 0, W, H);
graphic.Dispose();
img = bpm;
((Button)sender).Enabled = false;
string select = Path.GetFileNameWithoutExtension(slika);
img.Save(tbSave.Text + "\" + select + exten[GetSelecetedIndex()]);
bpm.Dispose();
img.Dispose();
});
我希望它看起来更像:
private void button3_Click(object sender, EventArgs e)
{
int W = Convert.ToInt32(txtW.Text);
int H = Convert.ToInt32(txtH.Text);
Parallel.ForEach(listaslika, slika =>
{
using (Bitmap bmp = new Bitmap(W, H))
{
using (Graphics graphic = Graphics.FromImage(bmp))
{
using (FileStream fs = new FileStream(tbSelect.Text + "\" + slika, System.IO.FileMode.Open))
{
using (Image img = Image.FromStream(fs))
{
graphic.DrawImage(img, 0, 0, W, H);
}
}
}
string select = Path.GetFileNameWithoutExtension(slika);
bmp.Save(tbSave.Text + "\" + select + exten[GetSelecetedIndex()]);
}
});
}