正确处理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

回到顶部