2016-06-22 11 views
-1

イメージをJSON形式のデータフィードに含めたいとします。だから私はクライアントに画像を転送することができます。イメージをJSONフィードに保存するにはどうすればよいですか?

+0

あなたは、画像のURLを保存することができますが、実際の画像には、JSONを介して送信することはできませんあなたが何らかの形で文字列(または文字列の配列など)としてそれをエンコードするために管理しないと、後でそれをデコード。 [JSONデータ型](https://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example)を参照してください。 – cavpollo

答えて

1

JSONはテキストベースなので、他の種類のデータを含める標準的な方法はありません。しかし、画像(または他のバイナリコンテンツ)をJSONフィードに含まれるBase64文字列に「翻訳」することはできます。

このコードは、very good blogpost of Jerry Nixonに基づいています。

これらのメソッドを追加するクラスに、System.IO、Windows.UI.Xaml.Media、System.Runtime.InteropServices.WindowsRuntimeおよびWindows.UI.Xaml.Media.Imagingを追加します。 私の場合は、静的メソッドを使って静的クラスを実装しました。

private static async Task<string> ToBase64(StorageFile bitmap) 
    { 
     var stream = await bitmap.OpenAsync(Windows.Storage.FileAccessMode.Read); 
     var decoder = await BitmapDecoder.CreateAsync(stream); 
     var pixels = await decoder.GetPixelDataAsync(); 
     var bytes = pixels.DetachPixelData(); 
     return await ToBase64(bytes, (uint)decoder.PixelWidth, (uint)decoder.PixelHeight, decoder.DpiX, decoder.DpiY); 
    } 

    private static async Task<string> ToBase64(RenderTargetBitmap bitmap) 
    { 
     var bytes = (await bitmap.GetPixelsAsync()).ToArray(); 
     return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight); 
    } 

    private static async Task<string> ToBase64(byte[] image, uint height, uint width, double dpiX = 96, double dpiY = 96) 
    { 
     // encode image 
     var encoded = new InMemoryRandomAccessStream(); 
     var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, encoded); 
     encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, height, width, dpiX, dpiY, image); 
     await encoder.FlushAsync(); 
     encoded.Seek(0); 

     // read bytes 
     var bytes = new byte[encoded.Size]; 
     await encoded.AsStream().ReadAsync(bytes, 0, bytes.Length); 

     // create base64 
     return Convert.ToBase64String(bytes); 
    } 

    public async static Task<string> ConvertFileToBase64(StorageFile file) 
    { 
     var stream = await file.OpenAsync(FileAccessMode.Read); 
     var decoder = await BitmapDecoder.CreateAsync(stream); 
     var pixels = await decoder.GetPixelDataAsync(); 
     var bytes = pixels.DetachPixelData(); 
     return await ToBase64(bytes, (uint)decoder.PixelWidth, (uint)decoder.PixelHeight, decoder.DpiX, decoder.DpiY); 
    } 

    public static async Task<ImageSource> FromBase64(string base64) 
    { 
     // read stream 
     var bytes = Convert.FromBase64String(base64); 
     var image = bytes.AsBuffer().AsStream().AsRandomAccessStream(); 

     // decode image 
     var decoder = await BitmapDecoder.CreateAsync(image); 
     image.Seek(0); 

     // create bitmap 
     var output = new WriteableBitmap((int)decoder.PixelHeight, (int)decoder.PixelWidth); 
     await output.SetSourceAsync(image); 
     return output; 
    } 
関連する問題