Поделиться WriteableBitmap как файл

В настоящее время я пишу небольшое приложение для редактирования изображений для Магазина Windows, в котором я хотел бы использовать чудо-кнопку «Поделиться» для отредактированных изображений. Поскольку некоторые приложения принимают только StorageFiles, а не растровые изображения (например, почтовое приложение по умолчанию), я хотел бы предлагать изображения обоими способами, как описано здесь: http://www.jeffblankenburg.com/2012/11./07/31-days-of-windows-8-day-7-share-contract Однако я не знаю, как создать StorageFile из WrieableBitmap.

Возможно, вы могли бы помочь мне завершить мой код ниже.

// Share Image
async void dtm_DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
{
    DataRequestDeferral deferral = e.Request.GetDeferral();

    DataPackage requestData = e.Request.Data;
    requestData.Properties.Title = "My Image";
    requestData.Properties.Description = "Created using a Windows Store App.";


    // This stream is to create a bitmap image later
    IRandomAccessStream stream = new InMemoryRandomAccessStream();

    // Determin which type of BitmapEncoder we should create
    Guid encoderId = BitmapEncoder.JpegEncoderId;

    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, stream);
    Stream pixelStream = theImage.PixelBuffer.AsStream();
    byte[] pixels = new byte[pixelStream.Length];
    await pixelStream.ReadAsync(pixels, 0, pixels.Length);
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)theImage.PixelWidth, (uint)theImage.PixelHeight, 96.0, 96.0, pixels);

    requestData.SetBitmap(RandomAccessStreamReference.CreateFromStream(stream));



    // What goes here?
    StorageFile storageFileImage = 



    List<IStorageItem> files = new List<IStorageItem>();
    files.Add(storageFileImage);
    requestData.SetStorageItems(files);


    requestData.Properties.Thumbnail = RandomAccessStreamReference.CreateFromStream(stream);
    await encoder.FlushAsync();


    deferral.Complete();
}

person Thomas    schedule 25.06.2013    source источник


Ответы (1)


Ниже показано, как кодировать WriteableBitmap wb в StorageFile, который находится в библиотеке изображений.

private static async Task<StorageFile> SaveAsJpeg(WriteableBitmap wb)
{
     byte[] pixels;
     using (var stream = wb.PixelBuffer.AsStream())
     {
        pixels = new byte[(uint)stream.Length];
        await stream.ReadAsync(pixels, 0, pixels.Length);
     }
     var name = String.Format("{0}_{1:yyyy-MM-dd_HH-mm-ss}.jpg", "MyApp", DateTime.Now);
     var outputFile = await KnownFolders.PicturesLibrary.CreateFileAsync(name, CreationCollisionOption.ReplaceExisting);
     using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
     {
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, writeStream);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied,
                             (uint)wb.PixelWidth, (uint)wb.PixelHeight,
                             96, 96, pixels);
        await encoder.FlushAsync();

        using (var outputStream = writeStream.GetOutputStreamAt(0))
        {
           await outputStream.FlushAsync();
        }
     }
     return outputFile;
}
person Rene Schulte    schedule 26.06.2013
comment
да, но это то, что у меня уже есть, не так ли? Как мне получить StorageFile, которым я могу поделиться из этого потока? - person Thomas; 27.06.2013
comment
идеально, спасибо. Думаю, я никогда не понимал, как работают потоки до сих пор :-) - person Thomas; 01.07.2013