这是我的问题:

重复此方法的时间间隔为50毫秒。
从程序的开始到时间的推移,此过程的RAM内存不断增长,最后调试器将我“内存不足错误”扔到了加粗的行(drawimage方法)。

有谁能帮助我找到避免这种情况的解决方案,并向我解释为什么会发生这种情况?

PS。我的目标是连续旋转图片框的背景图像。我知道也许我可以直接在窗体上绘制而不是在pictureBox上绘制,但是如果有pictureBox的解决方案,我会很高兴:p

谢谢!

public static Bitmap RotateImage(Image image, PointF offset, float angle)
    {
        if (image == null)
            throw new ArgumentNullException("image");

        //create a new empty bitmap to hold rotated image
        Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
        rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

        //make a graphics object from the empty bitmap
        Graphics g = Graphics.FromImage(rotatedBmp);

        //Put the rotation point in the center of the image
        g.TranslateTransform(offset.X, offset.Y);

        //rotate the image
        g.RotateTransform(angle);

        //move the image back
        g.TranslateTransform(-offset.X, -offset.Y);

        //draw passed in image onto graphics object
        **g.DrawImage(image, new PointF(0, 0));**

        return rotatedBmp;
    }

最佳答案

您还需要同时使用旧的位图的Dispose()。

假设您的代码如下所示:

public static Bitmap RotateImage(Image image, PointF offset, float angle)
{
    if (image == null)
        throw new ArgumentNullException("image");

    //create a new empty bitmap to hold rotated image
    Bitmap rotatedBmp = new Bitmap(image.Width, image.Height);
    rotatedBmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    return rotatedBmp;
}


我尝试循环调用您的函数,但仍然失败!我不得不自己处理位图。我不清楚.NET为什么不清理它们。

Image img = new Bitmap(@"some_image.png");
PointF p = new PointF(0,0);
for (int i=0; i<5000; i++)
{
    Bitmap b = RotateImage(img, p, i % 360);
    b.Dispose(); // Fails if you don't do this!
}

09-07 07:08