正确处理Image / Bitmap和PictureBox的方法
我正在尝试开发Windows Mobile 6(在WF /
C#中)应用程序。只有一个窗体,并且在窗体上只有一个PictureBox对象。在其上绘制所有所需的控件或所需的任何控件。
我正在做两件事。绘制自定义形状并从.png文件加载位图。
下一行在加载时锁定文件(这是不希望的情况):
Bitmap bmp = new Bitmap("file.png");
所以我正在使用另一种方式加载位图。
public static Bitmap LoadBitmap(string path) { using (Bitmap original = new Bitmap(path))
{
return new Bitmap(original);
}
}
我想这要慢得多,但是我不知道有什么更好的方法来加载图像,同时快速释放文件锁。
现在,当绘制图像时,有一种我使用的方法:
public void Draw() { Bitmap bmp = new Bitmap(240,320);
Graphics g = Graphics.FromImage(bmp);
// draw something with Graphics here.
g.Clear(Color.Black);
g.DrawImage(Images.CloseIcon, 16, 48);
g.DrawImage(Images.RefreshIcon, 46, 48);
g.FillRectangle(new SolidBrush(Color.Black), 0, 100, 240, 103);
pictureBox.Image = bmp;
}
但是,这似乎是某种内存泄漏。如果我做的时间太久,该应用程序最终将崩溃。
因此,我有3个问题:
从文件加载位图而不锁定文件的更好方法是什么?
哪些对象需要在Draw()函数中手动放置(以什么顺序排列),所以没有内存泄漏和ObjectDisposedException抛出?
如果将pictureBox.Image设置为bmp,就像代码的最后一行一样,pictureBox.Image.Dispose()会只分配与维护pictureBox.Image或设置为它的基础位图有关的资源吗?
回答:
1:我不知道它是否可以在Windows Mobile中运行,但是请尝试以下操作:
FileStream bitmapFile = new FileStream("mybitmap.bmp", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);Image loaded = new Bitmap(bitmapFile);
2:SolidBrush
必须丢弃。有处理的一般规则。->“您实例化的,实现处置的每个对象都必须手动处置,该对象 返回/引用/输出值时应展示”
在这种情况下,最好使用一条using
语句
using (new objecttodispose){ ..... }
该using
语句将确保Dispose()
在任何情况下都进行调用(例如,例外)。
3:Dispose()
将释放位图资源。
以上是 正确处理Image / Bitmap和PictureBox的方法 的全部内容, 来源链接: utcz.com/qa/429672.html