0

我对此一直有很大的问题。这是我的代码。

    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();

这次没有用。

4

1 回答 1

0

为了避免BitmapImage创建文件锁,您必须注意更多的初始化。根据这个关于 SO的问题,可以这样做(从他们的 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;
}
于 2013-09-21T17:57:33.787 回答