2016-05-24 3 views
3

Я получаю изображение с помощью URI (веб или файловой системы), и хочу, чтобы кодировать его в PNG и сохранить во временный файл:UWP закодировать изображение PNG

var bin = new MemoryStream(raw).AsRandomAccessStream(); //raw is byte[] 
var dec = await BitmapDecoder.CreateAsync(bin); 
var pix = (await dec.GetPixelDataAsync()).DetachPixelData(); 

var res = new FileStream(Path.Combine(ApplicationData.Current.LocalFolder.Path, "tmp.png"), FileMode.Create); 
var enc = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, res.AsRandomAccessStream()); 
enc.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, dec.PixelWidth, dec.PixelHeight, 96, 96, pix); 
await enc.FlushAsync(); //hangs here 
res.Dispose(); 

проблема, этот код висит на await enc.FlushAsync() линия. Пожалуйста, помогите! Благодарю.

+0

ли этот код запускается в потоке пользовательского интерфейса или в фоновом потоке? –

+0

Его вызванный из обработчика событий так что поток пользовательского интерфейса – Tsayper

ответ

2

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

StorageFile file = await ApplicationData.Current.TemporaryFolder 
    .CreateFileAsync("image", CreationCollisionOption.GenerateUniqueName); 
using (IRandomAccessStream outputStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
{ 
    using (MemoryStream imageStream = new MemoryStream()) 
    { 
     using (Stream pixelBufferStream = image.PixelBuffer.AsStream()) 
     { 
      pixelBufferStream.CopyTo(imageStream); 
     } 

     BitmapEncoder encoder = await BitmapEncoder 
      .CreateAsync(BitmapEncoder.PngEncoderId, outputStream); 
     encoder.SetPixelData(
      BitmapPixelFormat.Bgra8, 
      BitmapAlphaMode.Ignore, 
      (uint)image.PixelWidth, 
      (uint)image.PixelHeight, 
      dpiX: 96, 
      dpiY: 96, 
      pixels: imageStream.ToArray()); 
     await encoder.FlushAsync(); 
    } 
} 

(My image является WriteableBitmap, не уверен, что ваш raw есть?)

+0

«raw» - это загруженное изображение, массив байтов. спасибо, я посмотрю, если что-то не удалено ... – Tsayper

+0

Каков формат ваших необработанных байтов? Если они уже представляют png-образ, вы можете просто сбрасывать байты в файл, нет? –

+0

это может быть любой формат, поэтому я сначала его расшифрую. производительность не вызывает беспокойства, поэтому преобразование png в png в порядке. – Tsayper

Смежные вопросы