我有C#winForm应用程序,它拥有一个pictureBox控件。此控件具有Paint事件。每次触发paint事件时,都会动态创建一个Bitmap,并对其执行一些绘制。当用户点击“保存”按钮时,编辑后的图像将保存为jpg文件。
直到现在还可以。当我在pictureBox中加载一个新图像时,之前编辑的剩余部分仍然存在。
每次加载新图像时,如何擦除位图并重新开始:
private void pb_Resim_Paint(object sender, PaintEventArgs e)
{
List<eVucutParcalari> list = new List<eVucutParcalari>(pointList.Keys);
// Loop through list
foreach (eVucutParcalari k in list)
{
Dictionary<Point, Color> dicItem = pointList[k];
foreach (KeyValuePair<Point, Color> pair in dicItem)
{
Point p = pair.Key;
Color c = pair.Value;
SolidBrush brush = new SolidBrush(c);
if (pb_Resim.Image == null)
return;
Bitmap bmp = new Bitmap(pb_Resim.Image);
Graphics gr = Graphics.FromImage(bmp);
gr.FillRectangle(brush, p.X, p.Y, 5, 5);
pb_Resim.Image = bmp;
}
}
}
答案 0 :(得分:2)
为什么不在加载新文件时创建一个全新的位图,并在加载时替换当前分配给pb_Resim.Image的位图?这将允许GC收集旧的位图,而无需您花费任何精力“清除”前一个位图,并确保您拥有一个全新的位图,而不会为新加载的文件留下任何残留的垃圾。
答案 1 :(得分:0)
Christian Graus撰写了几篇关于GDI +的文章,你可以在CodeProject找到。 (向下滚动到GDI +文章。)因为它们与您正在进行的活动类型直接相关,所以我建议您仔细查看。
答案 2 :(得分:0)
我认为你的意思是清除之前内容的图片框,它恰好是图像文件的位图对象。
你已经完成了 新画笔,新位图,从新位图获取新的图形画布。
有可能做一个新的PictureBox吗?
因为这就是我的应用程序必须快速反复显示一组图像时所做的事情。我确信有更好的方法来清除图片框,比如使用refresh()。
foreach ( ... )
{
pb_Resim = new PictureBox();
configPictureBoxDimensions();
...
}
为什么不首先尝试刷新()?它应该工作。
foreach ( ... )
{
pb_Resim = bmp;
pb_Resim.refresh();
...
}