C# ';GDI+;中发生一般性错误';保存图像时

C# ';GDI+;中发生一般性错误';保存图像时,c#,gdi,C#,Gdi,我在这方面遇到了不少问题。 这是我的密码 int frame = 0; //This is a wpf button event private void up_Click(object sender, RoutedEventArgs e) { frame++; LoadPic(); } private void LoadPic() { string fn = @"C:\Folder\ima

我在这方面遇到了不少问题。 这是我的密码

    int frame = 0;

    //This is a wpf button event
    private void up_Click(object sender, RoutedEventArgs e)
    {
        frame++;
        LoadPic();
    }
    private void LoadPic()
    {
        string fn = @"C:\Folder\image" + (frame % 2).ToString() + ".png";
        Bitmap bmp = new Bitmap(302, 170);
        bmp.Save(fn);
        bmp.Dispose();

        //Picebox is a wpf Image control
        Picbox.Source = new System.Windows.Media.Imaging.BitmapImage(new Uri(fn));
    }

    private void down_Click(object sender, RoutedEventArgs e)
    {
        frame--;
        LoadPic();
    }
当我启动程序时,一个wpf窗口弹出。有两个按钮显示代码中显示的事件

当我按两次向上按钮时,它工作正常。这会将两个PNG保存到位置

“C:\Folder\image0.png”和“C:\Folder\image1.png”

第三次按下按钮时,它应该会再次将其保存到“C:\Folder\image0.png”。 相反,它给出了异常“GDI+中发生了一般错误”

我以前也遇到过类似的问题,通过添加以下两行代码来解决:

GC.Collect();
GC.WaitForPendingFinalizers();

这一次不起作用。

为了避免BitmapImage创建的文件锁,您必须进行更多的初始化。据介绍,可以这样做(从VB.Net代码移植到C)


试着注释一下
Picbox.Source=…
-行,看看它是否可以保存它。我的猜测是,由于某种原因,图像被该行锁定。你是对的。我忘了提那件事
private void LoadPic()
{
    string fn = @"C:\Folder\image" + (frame % 2).ToString() + ".png";
    Bitmap bmp = new Bitmap(302, 170);
    bmp.Save(fn);
    bmp.Dispose();

    var img = new System.Windows.Media.Imaging.BitmapImage();
    img.BeginInit();
    img.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
    img.UriSource = new Uri(fn);
    img.EndInit();
    Picbox.Source = img;
}