如何在JSON提要中存储图像?

如何在JSON提要中存储图像?,json,image,storage,Json,Image,Storage,我想在JSON格式的数据源中包含图像。因此我可以将图像传输到客户端。JSON是基于文本的,因此没有标准的方法来包含其他类型的数据。但是,您可以将图像(或任何其他二进制内容)转换为Base64字符串,该字符串可以包含在JSON提要中 此代码基于一个 将这些用法添加到添加这些方法的类中:System.IO、Windows.UI.Xaml.Media、System.Runtime.InteropServices.WindowsRuntime和Windows.UI.Xaml.Media.Imaging。

我想在JSON格式的数据源中包含图像。因此我可以将图像传输到客户端。

JSON是基于文本的,因此没有标准的方法来包含其他类型的数据。但是,您可以将图像(或任何其他二进制内容)转换为Base64字符串,该字符串可以包含在JSON提要中

此代码基于一个

将这些用法添加到添加这些方法的类中: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;
    }
私有静态异步任务ToBase64(存储文件位图)
{
var stream=wait bitmap.OpenAsync(Windows.Storage.FileAccessMode.Read);
var解码器=等待BitmapDecoder.CreateAsync(流);
var pixels=await decoder.GetPixelDataAsync();
var bytes=pixels.DetachPixelData();
返回wait ToBase64(字节,(uint)decoder.PixelWidth,(uint)decoder.PixelHeight,decoder.DpiX,decoder.DpiY);
}
专用静态异步任务ToBase64(RenderTargetBitmap位图)
{
var bytes=(wait bitmap.GetPixelsAsync()).ToArray();
返回wait ToBase64(字节,(uint)bitmap.PixelWidth,(uint)bitmap.PixelHeight);
}
专用静态异步任务ToBase64(字节[]图像,单元高度,单元宽度,双dpiX=96,双dpiY=96)
{
//编码图像
var encoded=新的InMemoryRandomAccessStream();
var encoder=await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId,encoded);
编码器.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Straight,height,width,dpiX,dpiY,image);
等待编码器。FlushAsync();
编码的Seek(0);
//读取字节
var bytes=新字节[encoded.Size];
wait encoded.AsStream().ReadAsync(字节,0,字节.长度);
//创建base64
返回Convert.tobase64字符串(字节);
}
公共异步静态任务ConvertFileToBase64(存储文件)
{
var stream=await file.OpenAsync(FileAccessMode.Read);
var解码器=等待BitmapDecoder.CreateAsync(流);
var pixels=await decoder.GetPixelDataAsync();
var bytes=pixels.DetachPixelData();
返回wait ToBase64(字节,(uint)decoder.PixelWidth,(uint)decoder.PixelHeight,decoder.DpiX,decoder.DpiY);
}
来自base64的公共静态异步任务(字符串base64)
{
//读流
var bytes=Convert.FromBase64String(base64);
var image=bytes.AsBuffer().AsStream().AsRandomAccessStream();
//解码图像
var decoder=await BitmapDecoder.CreateAsync(图像);
image.Seek(0);
//创建位图
var输出=新的WriteableBitmap((int)decoder.PixelHeight,(int)decoder.PixelWidth);
等待输出。设置源同步(图像);
返回输出;
}

您可以存储图像的URL,但实际图像无法通过JSON发送,除非您设法将其编码为字符串(或字符串数组等)并在稍后解码。看见