2013-05-03 2 views
3

Я работаю над приложением Metro, где мне нужно сгенерировать анимированный GIF-образ.BitmapEncoder SetPixelData memory allocation

Я нашел this tutorial, ведьма кажется единственным и единственным ресурсом для анимированных GIF-приложений для приложений Metro.

При выполнении этого кода генерируется исключение на методе SetPixelData, говоря мне, что выделенный буфер памяти недостаточно (сообщение на моем языке OS, хотя мой Visual Studio Environnement на английском языке, я думаю, что это может быть актуальным).

Я уменьшил размер изображения (источник и вывод) и номер кадра, но я все еще получаю эту ошибку. (Я манипулирую более крупными изображениями и массивом байтов в одном приложении).

Любая идея, из-за которой может возникнуть эта проблема с памятью? Может быть, проблема с моей StorageFile?

+0

У меня такая же проблема, и я не знаю, какой буфер недостаточен. Я пытаюсь записать файл. –

ответ

-1

Умножьте буферизацию на битдепт.

+0

Можете ли вы уточнить? Я не вижу, какой буферизации следует умножить. Я не очень хорошо разбираюсь в манипуляциях с памятью в .NET. – skwi

+0

Скажем, например, у вас есть изображение 100x100. Скажем, что каждый пиксель этого изображения может иметь 16 оттенков серого. Сколько места вам нужно для хранения этого изображения? 100x100x16 – playerone

1

Я видел это исключение, когда frameWidth \ Height, передаваемый в SetPixelData, не соответствовал данным пикселя.

В результате я привел этот пример ниже. Я видел исключение, о котором вы говорили, когда размеры не совпадали с pixelData.

Я думаю, что это более стабильно в 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; 
       } 
      }