3

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

我找到了这个教程,女巫似乎是 Metro 应用程序动画 GIF 的唯一资源。

运行此代码时,在 SetPixelData 方法上引发异常,告诉我分配的缓冲区内存不足(即使我的 Visual Studio 环境是英文的,该消息也是我的操作系统语言,我认为这可能是相关的)。

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

知道这个内存问题可能来自哪里吗?我的 StorageFile 可能有问题?

4

2 回答 2

2

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

我最终得到了下面的这个例子。当尺寸与像素数据不匹配时,我看到了您提到的异常。

我认为这在 Windows 8.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;
                }
            }
于 2013-08-26T22:58:13.303 回答
-1

将缓冲区大小乘以位深度。

于 2013-05-03T11:55:26.003 回答