【问题标题】:Windows Phone 8.1 Exception when creating WriteableBiitmap创建 WriteableBitmap 时的 Windows Phone 8.1 异常
【发布时间】:2015-01-11 13:17:21
【问题描述】:

我正在制作一个 Windows Phone 8.1 应用程序(Windows 运行时,而不是 Silverlight 8.1),我需要从 Stream 创建一个 WriteableBitmap,但是当我尝试这样做时,我得到了这个异常:“类型的异常'System.Exception' 发生在 mscorlib.ni.dll 中,但未在用户代码中处理

附加信息:找不到该组件。 (例外来自 HRESULT: 0x88982F50)"

我已经尝试了很多东西,但仍然没有运气。我的代码如下:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var files = await KnownFolders.CameraRoll.GetFilesAsync();
    for(int i=0; i<files.Count; i++)
    {
        var fileStream = await files[i].OpenReadAsync();
        if(fileStream != null)
        {
             WriteableBitmap writeableBmp = await BitmapFactory.New(1, 1).FromStream(fileStream);
        }
    }
}

但如果我替换,这不会发生

var fileStream = await files[i].OpenReadAsync();

例如,

var fileStream = await files[0].OpenReadAsync();

有什么想法吗? 谢谢。

【问题讨论】:

    标签: c# windows-runtime windows-phone-8.1


    【解决方案1】:

    这很奇怪。我认为您已经检查了 appxmanifest 文件中的“图片库”功能。

    此代码适用于我:

    public static async Task<WriteableBitmap> GetWritableBitmapFromStream(Stream stream)
    {
        var decoder = await BitmapDecoder.CreateAsync(stream.AsRandomAccessStream());
        var pixelData = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, new BitmapTransform(), ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage);
        var pixels = pixelData.DetachPixelData();
    
        var bmp = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
        using (var bmpStream = bmp.PixelBuffer.AsStream())
        {
            bmpStream.Seek(0, SeekOrigin.Begin);
            await bmpStream.WriteAsync(pixels, 0, (int)bmpStream.Length);
        }
        return bmp;
    }
    
    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        var files = await KnownFolders.CameraRoll.GetFilesAsync();
        foreach (var file in files)
        {
            // need "using System.IO" for this extension method
            using (var fileStream = await file.OpenStreamForReadAsync())
            {
                WriteableBitmap writeableBmp = await GetWritableBitmapFromStream(fileStream);
                // do something with writableBmp
            }
        }
    }
    

    【讨论】:

    • 这就是我所做的:新建空的 WP 8.1 项目;向 MainPage 添加了一个按钮;将此代码添加到代码隐藏中;在模拟器中拍了一些“照片”;运行应用程序。没有问题。我不知道我还能做什么。究竟是哪一行代码为您抛出了错误?
    • 抛出错误的行是:WriteableBitmap writeableBmp = await GetWriteableBitmapFromStream(fileStream);但这只有在我的模拟器上有超过 150 张照片时才会发生,否则它会按预期工作。
    • 什么类型的文件无法打开?它不是 .jpg 或 .png 文件吗?也许设备在第 150 张照片时内存不足?
    • 是的,它在第 150 张照片时向我抛出了 OutOfMemoryException。我该怎么做才能解决它?我已经尝试过 writeableBmp = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();并且使用 GC.ADDMemoryPressure(),没有运气。我还能做什么?
    • 您是否添加了任何其他代码?您是否在其他地方引用了位图?如果某物(任何东西)正在引用它,则不会对位图进行垃圾收集。您应该运行内存分析器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多