2016-06-22 4 views
-1

Ich möchte Bilder in einen JSON-Format-Datenfeed einschließen. So kann ich Bilder auf den Client übertragen.Wie kann ich ein Bild in einem JSON-Feed speichern?

+0

können Sie speichern die URL des Bildes, sondern eine tatsächliche Bild kann nicht durch JSON gesendet werden, wenn Sie es irgendwie als String zu kodieren verwaltet (oder ein Array von Strings, usw.) und es dekodieren später . Siehe [JSON-Datentypen] (https://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example) – cavpollo

Antwort

1

JSON ist textbasiert, daher gibt es keine Standardmethode zum Einschließen anderer Datentypen. Sie können jedoch ein Bild (oder einen anderen binären Inhalt) in eine Base64-Zeichenfolge "übersetzen", die in einem JSON-Feed enthalten sein kann.

Dieser Code basiert auf very good blogpost of Jerry Nixon.

Fügen Sie diese Verwendung der Klasse hinzu, in der Sie diese Methoden hinzufügen: System.IO, Windows.UI.Xaml.Media, System.Runtime.InteropServices.WindowsRuntime und Windows.UI.Xaml.Media.Imaging. In meinem Fall habe ich eine statische Klasse mit statischen Methoden implementiert.

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