c# - 将图像数组转换为 JSON 文件并在 C# 之后对其进行解码
问题描述
我想创建一个包含图像的数组,然后将其提取为 JSON 文件。然后将此文件上传到服务器。然后将此文件下载到一个项目中,然后我想将 JSON 文件转换回它之前的图像数组,以便我可以从其中检索图像。那么这个编解码过程是如何实现的呢?这在 C# 中可能吗?(我使用 Unity3D 更准确)谢谢
解决方案
一般来说,以基于文本的格式存储二进制数据是一个坏主意......可以这样做,但需要 Base64 编码的字符串(ToBase64String
和FromBase64String
)......这需要比原始字节本身更多的内存。
但是,是的,您可能可以使用类似的东西,例如
// 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="
},
....
]
}
注意:在智能手机上输入,但我希望这个想法很清楚
推荐阅读
- typescript - 打字稿获取字段名称但不获取属性(或至少仅获取)
- jenkins - 如何使用 nunit 控制台运行程序从命令行运行多个测试?
- python - 如何将单词与列表中的元素分开?
- python - 视频到 ASCII 转换器——优化
- laravel - 是否可以在 firstOrNew、firstOrCreate、updateOrCreate 上使用 WhereIn / WhereNull 或 Condition?
- swiftui - 如何将 String?-type 对象分配给 String-type 变量?
- ruby-on-rails - RSpec - 无法模拟 ActiveRecord 模型类
- tags - 找不到模块:无法解析“react-meta-tags”
- javascript - 图像不会使用这些脚本调整大小
- jquery - 更改事件不适用于使用 jquery 的 span 标签