将图像数组转换为 JSON 文件并在 C# 之后对其进行解码

Posted

技术标签:

【中文标题】将图像数组转换为 JSON 文件并在 C# 之后对其进行解码【英文标题】:Convert array of images to JSON file and decode it after C# 【发布时间】:2021-08-02 15:46:11 【问题描述】:

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

【问题讨论】:

您可以将所有图像转换为 base64 字符串,并创建这些字符串的数组并将其转换为 JSON。当您检索 JSON 时,您可以将 base64 字符串转换回图像。 您确定需要为此使用 json 吗?你看过资产包吗? 【参考方案1】:

一般而言,以基于文本的格式存储二进制数据是个坏主意……可以这样做,但需要 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,其结构有点像例如


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

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

        ....
    ]


注意:在智能手机上输入,但我希望思路清晰

【讨论】:

以上是关于将图像数组转换为 JSON 文件并在 C# 之后对其进行解码的主要内容,如果未能解决你的问题,请参考以下文章

我想将图像数据(Texture2D)转换为 Base64 字符串并存储在 Unity3D(C#)中的 JSON 文件中

使用 C# 将数据表转换为分层数据结构 (JSON)

将 json 转换为 C# 数组?

如何将 c# 二维数组转换为 JSON 对象?

Xamarin 表单将 Json 数组转换为 C# 并返回 JSON 数组

如何在 C# 中将 .json 文件转换为字符串 [重复]