一尘不染

正确处理Image / Bitmap和PictureBox的方法

c#

我正在尝试开发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个问题:

1.) 从文件加载位图而不锁定文件的更好方法是什么?

2.) 哪些对象需要在Draw()函数中手动放置(以什么顺序排列),所以没有内存泄漏和ObjectDisposedException抛出?

3.)
如果将pictureBox.Image设置为bmp,就像代码的最后一行一样,pictureBox.Image.Dispose()会只分配与维护pictureBox.Image或设置为它的基础位图有关的资源吗?


阅读 877

收藏
2020-05-19

共1个答案

一尘不染

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()将释放位图资源。

2020-05-19