【问题标题】:Deserialization .json to Bitmap image c#将.json反序列化为位图图像c#
【发布时间】:2017-09-27 22:18:43
【问题描述】:

我有一个位图图像,我使用以下方法将其转换为 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: "对于"System.Bitmap" 类型, 没有参数的构造函数没有定义。”

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

谢谢!

【问题讨论】:

  • 你的 json 怎么样?
  • 为什么要将位图(二进制)转换为 json?
  • 显示它?或者你用它做什么?
  • @MrsLSD 您是否意识到您的 JSON 不包含实际图像,仅包含图像属性。并且在序列化时您将无法再次显示图像?
  • @MrsLSD 停止。想想看。您已经有一个可以保存为文件的二进制对象。然后你需要在pictureBox 中显示这个文件。只需再次读取该二进制文件并显示它。为什么要涉及 JSON 和序列化?

标签: c# json.net json-deserialization


【解决方案1】:

消息的错误是......对此非常清楚。如果您查看BitmapMSDN 文档,您会发现它没有定义空构造函数。 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。

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

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

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

【讨论】:

  • 我做到了!我应该添加解决方案吗?
  • @MrsLSD 如果我写的是您寻求的答案,那么是的,如果您将此标记为正确的解决方案,那就太好了。 ;)
【解决方案2】:

由于 Bitmap 没有默认构造函数,因此不能开箱即用地进行反序列化。

您可以尝试将 JSON 负载反序列化为字节数组,然后通过 MemoryStream 将其传递给 Bitmap.FromStream。

string image = json;

byte[] byteBuffer = Convert.FromBase64String(image);
MemoryStream memoryStream = new MemoryStream(byteBuffer);
memoryStream.Position = 0;

return (Bitmap)Bitmap.FromStream(memoryStream);

感谢http://ingsharksoft.blogspot.be/2013/07/solution-problem-serializedeserialize.html

【讨论】:

  • 我不确定图像是如何序列化的。
猜你喜欢
  • 2012-05-16
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2015-06-07
相关资源
最近更新 更多