C# 位图编码器设置像素数据内存分配

C# 位图编码器设置像素数据内存分配,c#,microsoft-metro,winrt-async,C#,Microsoft Metro,Winrt Async,我正在开发一个Metro应用程序,需要生成一个动画GIF图像 我发现,witch似乎是Metro应用程序中动画GIF的唯一资源 运行此代码时,SetPixelData方法会引发异常,告诉我分配的缓冲区内存不足(尽管我的Visual Studio环境是英文的,但消息是用我的操作系统语言显示的,我认为可能相关) 我已经减小了图像大小(源和输出)和帧数,但仍然会出现此错误。(我在同一个应用程序中处理更大的图像和字节数组) 你知道这个记忆问题是从哪里来的吗?我的StorageFile可能有问题?将缓冲区

我正在开发一个Metro应用程序,需要生成一个动画GIF图像

我发现,witch似乎是Metro应用程序中动画GIF的唯一资源

运行此代码时,SetPixelData方法会引发异常,告诉我分配的缓冲区内存不足(尽管我的Visual Studio环境是英文的,但消息是用我的操作系统语言显示的,我认为可能相关)

我已经减小了图像大小(源和输出)和帧数,但仍然会出现此错误。(我在同一个应用程序中处理更大的图像和字节数组)


你知道这个记忆问题是从哪里来的吗?我的StorageFile可能有问题?

将缓冲区大小乘以位深度

当传入SetPixelData的frameWidth\Height与像素数据不匹配时,我看到了这个异常

我以下面这个例子结束。我看到了你提到的例外,当尺寸与像素数据不匹配时

我认为这在Windows8.1中更稳定,因为它不会重新启动

BitmapDecoder decoder = await BitmapDecoder.CreateAsync(sourceStream);
                BitmapTransform transform = new BitmapTransform()
                {
                    ScaledHeight = 900,
                    ScaledWidth = 600
                };
                PixelDataProvider pixelData = await decoder.GetPixelDataAsync(BitmapPixelFormat.Rgba8,
                                                                              BitmapAlphaMode.Straight,
                                                                              transform,
                                                                              ExifOrientationMode.RespectExifOrientation,
                                                                              ColorManagementMode.DoNotColorManage);

                StorageFile destinationFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(Path.Combine(Database.rootMoviesFoldersPaths, movie.LocalId + ".jpg"));
                using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, destinationStream);
                    encoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Premultiplied, 600, 900, 96, 96, pixelData.DetachPixelData());
                    await encoder.FlushAsync();

                    movie.HasFolderImage = true;

                    return true;
                }
            }

你能说得更具体些吗?我看不出应该乘以哪个缓冲区大小。我不太熟悉.NET中的内存操作。例如,您有一个100x100的映像。假设此图像的每个像素可以有16种灰度。您需要多少空间来存储此图像?100x100x16I也有同样的问题,我不知道什么缓冲区不足。我正试图写入一个文件。