首页 > 解决方案 > 将图像数组转换为 JSON 文件并在 C# 之后对其进行解码

问题描述

我想创建一个包含图像的数组,然后将其提取为 JSON 文件。然后将此文件上传到服务器。然后将此文件下载到一个项目中,然后我想将 JSON 文件转换回它之前的图像数组,以便我可以从其中检索图像。那么这个编解码过程是如何实现的呢?这在 C# 中可能吗?(我使用 Unity3D 更准确)谢谢

标签: c#jsonunity3d

解决方案


一般来说,以基于文本的格式存储二进制数据是一个坏主意......可以这样做,但需要 Base64 编码的字符串(ToBase64StringFromBase64String)......这需要比原始字节本身更多的内存。

但是,是的,您可能可以使用类似的东西,例如

// The root JSON object
[Serializable]
public class Root
{
    public List<ImageData> encodedImages = new List<ImageData>();

    // Empty constructor required by serializer
    public Root(){ }

    public Root(Texture2D[] textures)
    {
        foreach(var tex in textures)
        {
            encodedImages.Add(new ImageData(tex));
        }
    }
}

// Data for each encoded image/Texture2D
[Serializable]
public class ImageData
{
    public int width;
    public int height;
    public int type;
    public string encodedData;

    // empty constructor required by serializer
    public ImageData() { }

    pubilc ImageData(Texture2D tex)
    {
        width = tex.width;
        height = tex.height;
        type = (int)tex.format;

        // Note that this is SLOW!
        var bytes = tex.EncodeToPNG();

        encodedData = Convert.ToBase64String(bytes);
    }

    public Texture2D GetTexture()
    {
        var bytes = Convert.FromBase64String(encodedData);

        var tex = new Texture(width, height, (TextureFormat)type, false);
        tex.LoadRawTextureData(bytes);
        tex.Apply();

        return tex;
    }
}

public string Encode(Texture2D[] textures)
{
    var output = new Root(textures);

    return JsonUtility.ToJson(output);
}

public Texture2D[] Decode(string json)
{
    var root = JsonUtility.FromJson<Root>(json);

    var count = root.encodedImages.Length;
    var output = new Texture2D[count];

    for(var i = 0; i < count; i++)
    {
        output[i] = root.encodedImages[i].GetTexture();
    }

    return output.ToArray();
}

如前所述,虽然可能效率不高。

这将生成一个 JSON,其结构有点像 eg

{
    "encodedImages": 
    [
        {
            "width": 1080,
            "height": 1920,
            "type": 4,
            "encodedData": "U29tZSBCYXNlNjQgRW5jb2RlZCBJbWFnZSBEYXRhIEhlcmUh"
        },

        {
            "width": 800,
            "height": 600,
            "type": 4,
            "encodedData": "RXZlbiBtb3JlIEJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEgaGVyZSE="
        },

        ....
    ]
}

注意:在智能手机上输入,但我希望这个想法很清楚


推荐阅读