保存图像时,“GDI +中发生了一般错误”

时间:2013-09-21 17:48:11

标签: 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\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();

这次没用。

1 个答案:

答案 0 :(得分:0)

要避免BitmapImage创建的文件锁,您必须处理更多初始化。根据{{​​3}},它可以这样做(从他们的VB.Net代码移植到C#)。

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;
}