locked
Bitmap资源如何释放? RRS feed

  • 问题

  •        

           private async void btnSave_Click(object sender, RoutedEventArgs e)//将截图保存到本地文件夹
           {
                RenderTargetBitmap bitmap = new RenderTargetBitmap();
                await bitmap.RenderAsync(root);
                var pixelBuffer = await bitmap.GetPixelsAsync();
                IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder;
                IStorageFile saveFile = await applicationFolder.CreateFileAsync("snapshot.png", CreationCollisionOption.OpenIfExists);
                using (var fileStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream);
                        encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                        BitmapAlphaMode.Ignore,
                        (uint)bitmap.PixelWidth,
                        (uint)bitmap.PixelHeight,
                        DisplayInformation.GetForCurrentView().LogicalDpi,
                        DisplayInformation.GetForCurrentView().LogicalDpi,
                        pixelBuffer.ToArray());
                        await encoder.FlushAsync();
                }
            }

            private void btnShow_Click(object sender, RoutedEventArgs e)//读取本地文件夹中的截图文件并显示
            {
                BitmapImage bitmapImage = new BitmapImage(new Uri("ms-appdata:///local/snapshot.png", UriKind.Absolute));
                img.Source = bitmapImage;//设置image控件的Source
            }

    在上述代码中,btnShow_Click()事件触发后,bitmapImage似乎一只占用uri文件资源没有释放,导致再点击btnSave_Click()保存文件时出现文件访问异常:System.UnauthorizedAccessException

    请问如何处理?

    2015年1月9日 3:00

答案

  • 你好,

    这个问题可能的方案有:

    1. 复制图片
    2. 在覆盖之前清除使用此资源的引用

    以下是使用第二种方式的方案:

    public MainPage()
    {
                this.InitializeComponent();
    
                this.NavigationCacheMode = NavigationCacheMode.Required;
                bitmapImage = new BitmapImage();
    }
    
    BitmapImage bitmapImage;
    
    private async void btnSave_Click(object sender, RoutedEventArgs e)//将截图保存到本地文件夹
    {
                bitmapImage.UriSource = null;
                RenderTargetBitmap bitmap = new RenderTargetBitmap();
                ......
    }
    
    private void btnShow_Click(object sender, RoutedEventArgs e)//读取本地文件夹中的截图文件并显示
    {
                bitmapImage = new BitmapImage(new Uri("ms-appdata:///local/snapshot.png", UriKind.Absolute));
    
                img.Source = bitmapImage;//设置image控件的Source
    }


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Voyage-Si 2015年1月9日 13:22
    2015年1月9日 10:48
    版主