gpt4 book ai didi

c# - 反序列化.json 到位图图像c#

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:59 25 4
gpt4 key购买 nike

我有一个位图图像,我使用以下方法将其转换为 JSON 文件:

string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Bitmap image); 

.json 文件的内容:

{  
"Tag":null,
"PhysicalDimension":{
"IsEmpty":false,
"Width":376,
"Height":221
},
"Size":{
"IsEmpty":false,
"Width":376,
"Height":221
},
"Width":376,
"Height":221,
"HorizontalResolution":96,
"VerticalResolution":96,
"Flags":2,
"RawFormat":{
"Guid":"b96b3caa-0728-11d3-9d7b-0000f81ef32e"
},
"PixelFormat":2498570,
"Palette":{
"Flags":62,
"Entries":[

]
},
"FrameDimensionsList":[
"7462dc86-6180-4c7e-8e3f-ee7333a7a483"
],
"PropertyIdList":[

],
"PropertyItems":[

]
}

现在我尝试以这种方式反序列化文件:

Bitmap bm = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Bitmap>(json);

但出现错误:

System.MissingMethodException: "For the" System.Bitmap "type, the constructor without parameters is not defined."

是否有其他方法反序列化文件或如何修复此代码?

谢谢!

最佳答案

消息的错误是……在这一点上非常清楚。如果您查看 MSDN Bitmap 的文档,您会发现它没有定义空的构造函数。 JSON 反序列化器基本上创建指定类型的新实例(使用空构造函数),然后填充属性。 Bitmap 有点太复杂,无法正常工作。所以...您需要解决这个问题。

Bernard Vander Beken 已经向您展示了如何读取包含位图数据的 base64 字符串。以下是从现有位图中创建它的方法:

ImageConverter converter = new ImageConverter();
var bitmapData = Convert.ToBase64String((byte[])converter.ConvertTo(bitmap, typeof(byte[])));

请注意,在上面的示例中,bitmapData 是一个可以轻松发送、存储等的字符串(因此无需将其序列化为 JSON)。

编辑:

请注意,鉴于上述情况,您需要同时更新序列化和反序列化代码。 IE。要使用提供的反序列化示例,您需要发送/存储一个与您当前正在使用的完全不同的 JSON...这将不再是 JSON。

事实上,您当前的 JSON 文件并不真正包含实际图像;它只有一些关于您最初使用的图像的元数据。因此您肯定需要更改负责序列化的代码。

我还会稍微修改用于反序列化位图的代码(理论上,MemoryStream 应该被正确处理并且不需要设置位置)。

var bytes = Convert.FromBase64String(bitmapData);
Bitmap bitmap;
using (var ms = new MemoryStream(bytes))
bitmap = new Bitmap(Bitmap.FromStream(ms));

关于c# - 反序列化.json 到位图图像c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46449598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com