0

현재 편집 된 이미지에 공유 매력을 활용하고 싶은 Windows Store 용 작은 이미지 편집 응용 프로그램을 작성 중입니다. 일부 응용 프로그램은 StorageFiles 만 허용하고 비트 맵은 허용하지 않으므로 (기본 메일 응용 프로그램과 동일) 여기에 설명 된대로 두 가지 방법으로 이미지를 제공하고 싶습니다. http://www.jeffblankenburg.com/2012/11/07/31-days-of-windows-8-day-7-share-contract 그러나 WrieableBitmap에서 StorageFile을 만드는 방법을 모르겠습니다. .WriteableBitmap with File

아마도 아래 코드를 완료하는 데 도움이 될 것입니다.

// 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(); 
} 

답변

1

다음은 그림 라이브러리에있는 StorageFile에 WriteableBitmap wb를 인코딩하는 방법입니다.

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; 
} 
+0

그래, 그게 내가 이미 가진거야, 안 그래? 해당 스트림에서 공유 할 수있는 StorageFile을 얻으려면 어떻게해야합니까? – Thomas

+1

코드를 편집하여 StorageFile에 씁니다. –

+0

완벽, thx. 이제까지 스트림이 어떻게 작동하는지 결코 이해하지 못했을 것 같네요 .-) – Thomas