C# Json.net发送图片

liusa1997 2018-12-25 09:34:23
现在想发送图片,想法是把图片序列化然后在客户端反序列化,但是有个问题,引入的newtonsoft.net,里面的JsonConvert.SerializeObject()这个方法不能直接序列化byte[],比如
MemoryStream stream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(stream, json);
这个就能直接序列化成二进制,所以目前想序列化图片该怎么做呢?
...全文
1003 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybirding10011 2019-04-29
  • 打赏
  • 举报
回复
引用 39 楼 <span style="color:#4788C7">Code_Boy_Code</span>的回复:
为啥要这样搞呢,直接团bytes不行吗
<br />我没有引用啊 我去
flybirding10011 2019-04-29
  • 打赏
  • 举报
回复
我看看我信用的对不对
Solomon_Fang 2018-12-27
  • 打赏
  • 举报
回复
额(°_°)…
Code_Boy_Code 2018-12-27
  • 打赏
  • 举报
回复
为啥要这样搞呢,直接团bytes不行吗
xuzuning 2018-12-26
  • 打赏
  • 举报
回复
C# 已经提供了集成的便利操作方法,就不要再做原理性展开了
展开后,由于代码行增加,出错的几率也就增加,况且每步的中间结果的缓存,也加大了系统资源的开销
qbilbo 2018-12-26
  • 打赏
  • 举报
回复
引用
byte[] bufferClient = System.Text.Encoding.Default.GetBytes(Client.ToString());

你这是在干什么?
xuzuning 2018-12-26
  • 打赏
  • 举报
回复
是的,base64 就是将原本含有不可打印字符的内容,编码成全由可打印字符构成的内容,这样在数据交换过程中就不易丢失(或丢失了也很容易发现)了

Json.net 是可以序列化数组的,只是将原来的二进制内码转成了 ASCII 字面表示或 unicode 字面表示,显然数据会变得很长
而 base64 只是将每3个字节编码成4个字节
liusa1997 2018-12-26
  • 打赏
  • 举报
回复
textbox1.text是对话框我选择的本地图片路径:
string ImgPath = textBox1.Text;
FileInfo fi = new FileInfo(ImgPath);
byte[] buffer = new byte[fi.Length];

FileStream fs = fi.OpenRead();
int size = fs.Read(buffer, 0, (int)fi.Length);
fs.Close();
string result = JsonConvert.SerializeObject(buffer);
//这是反序列化,但是问题是为什么反出来后,它的长度在原来的30000左右变成了45000左右,也就是反序列后字节数组变大了???
var Client = JsonConvert.DeserializeObject(result);
//然后这个缓冲区是成功有值的
byte[] bufferClient = System.Text.Encoding.Default.GetBytes(Client.ToString());
MemoryStream ms = new MemoryStream();
ms.Write(bufferClient, 0, bufferClient.Length);
//问题::在这里ms会直接跳到catch那里(没粘贴),报出参数错误,但是缓冲区明明有值诶???
Bitmap bitmap = new Bitmap(ms);
ms.Close();

//用这个方法是能完全成功加载图片的
//FileStream file = new FileStream(ImgPath, FileMode.Open);
//file.Write(buffer, 0, (int)fi.Length);
//Bitmap bitmap = new Bitmap(file);
//file.Close();
/////////
Clipboard.SetDataObject(bitmap, false);
if (richTextBox1.CanPaste(DataFormats.GetFormat(DataFormats.Bitmap)))
{
richTextBox1.Paste();
richTextBox1.AppendText("\r\n");
richTextBox1.ScrollToCaret();
}
想请假下谁能详细解释下上面的两个问题,感谢
liusa1997 2018-12-26
  • 打赏
  • 举报
回复
引用 10 楼 likelinsiyuan 的回复:
将图片读取进内存后转字符串,再传输字符串,接收方接到字符串再还原成二进制数据

//二进制转字符串
string s = Convert.ToBase64String(byte[] bytes);
//字符串转二进制
byte[] bytes = Convert.FromBase64String(string s);

感谢你提供的思路,不过还是那个问题,就是为什么我贴出的那个代码ms会出现参数无效呢?
liusa1997 2018-12-26
  • 打赏
  • 举报
回复
引用 7 楼 真相重于对错 的回复:
用flash插件上传,或者试试websoctet.

想请教下,为什么反序列化后字节数组会变大?序列化变大很正常,但为什么反序列化并没有回到原来的大小呢?
liusa1997 2018-12-26
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
编码图片
byte[] var bs = File.ReadAllBytes("图片文件名");
string code = Convert.ToBase64String(bs);
code 是字符串,你可以用任何方式传递(自然包括 json)

解码成图片对象
byt[] bytes = Convert.FromBase64String(code);
MemoryStream ms = new MemoryStream(bytes);
Image im = Image.FromStream(ms);

你也可以
File.WriteAllBytes("图片文件名", bytes);
直接保存成文件


你好,你的意思是,将code进行序列化然后在客户端或者服务器再进行反序列化最后解码就行了吗?
xuzuning 2018-12-26
  • 打赏
  • 举报
回复
编码图片
byte[] var bs = File.ReadAllBytes("图片文件名");
string code = Convert.ToBase64String(bs);
code 是字符串,你可以用任何方式传递(自然包括 json)

解码成图片对象
byt[] bytes = Convert.FromBase64String(code);
MemoryStream ms = new MemoryStream(bytes);
Image im = Image.FromStream(ms);

你也可以
File.WriteAllBytes("图片文件名", bytes);
直接保存成文件
liusa1997 2018-12-26
  • 打赏
  • 举报
回复
分实在太少了,所以无法给每个回复的大佬都给分见谅,感谢以上大大们的回复
  • 打赏
  • 举报
回复
将图片读取进内存后转字符串,再传输字符串,接收方接到字符串再还原成二进制数据

//二进制转字符串
string s = Convert.ToBase64String(byte[] bytes);
//字符串转二进制
byte[] bytes = Convert.FromBase64String(string s);
desperaso 2018-12-26
  • 打赏
  • 举报
回复
base64,用byte[]还原需指定图像格式,否则打不开
看https://bbs.csdn.net/topics/392302761
平底锅锅锅 2018-12-26
  • 打赏
  • 举报
回复
还可以放在共享路径下
真相重于对错 2018-12-26
  • 打赏
  • 举报
回复
用flash插件上传,或者试试websoctet.
  • 打赏
  • 举报
回复
引用 33 楼 qq_40258437 的回复:
[quote=引用 30 楼 likelinsiyuan 的回复:]
[quote=引用 29 楼 qq_40258437 的回复:]
[quote=引用 28 楼 likelinsiyuan 的回复:]
那这里跟序列化没关系啊,你无非就是发送字符串而已。
区分按顺序用特殊符号隔开不就行了。
5555,图1路径,8888,图2路径.....
接收方取到整个字符串再以逗号分割做处理

你的意思就是,把这些部分全部转成base64然后发给接收方然后接收方去解base64就行了?
但问题是,路径转成的64到了接收方解64后他本地又没有当前路径对应的文件。还是说将这些部分转成byte[]然后base64接着放到流里面对方接收吗?[/quote]
那就5555,图1base64字符串,8888,图2base64字符串.....
发这一整个字符串过去就行了[/quote]
感觉问题越问越复杂,我这么说下,我服务器接受消息,客户端发送信息,然后客户端套接字怎么发送这消息?发的这个字符串还是要放进byte[]才能在服务器接收到流诶[/quote]

引用 33 楼 qq_40258437 的回复:
[quote=引用 30 楼 likelinsiyuan 的回复:]
[quote=引用 29 楼 qq_40258437 的回复:]
[quote=引用 28 楼 likelinsiyuan 的回复:]
那这里跟序列化没关系啊,你无非就是发送字符串而已。
区分按顺序用特殊符号隔开不就行了。
5555,图1路径,8888,图2路径.....
接收方取到整个字符串再以逗号分割做处理

你的意思就是,把这些部分全部转成base64然后发给接收方然后接收方去解base64就行了?
但问题是,路径转成的64到了接收方解64后他本地又没有当前路径对应的文件。还是说将这些部分转成byte[]然后base64接着放到流里面对方接收吗?[/quote]
那就5555,图1base64字符串,8888,图2base64字符串.....
发这一整个字符串过去就行了[/quote]
感觉问题越问越复杂,我这么说下,我服务器接受消息,客户端发送信息,然后客户端套接字怎么发送这消息?发的这个字符串还是要放进byte[]才能在服务器接收到流诶[/quote]

引用 33 楼 qq_40258437 的回复:
[quote=引用 30 楼 likelinsiyuan 的回复:]
[quote=引用 29 楼 qq_40258437 的回复:]
[quote=引用 28 楼 likelinsiyuan 的回复:]
那这里跟序列化没关系啊,你无非就是发送字符串而已。
区分按顺序用特殊符号隔开不就行了。
5555,图1路径,8888,图2路径.....
接收方取到整个字符串再以逗号分割做处理

你的意思就是,把这些部分全部转成base64然后发给接收方然后接收方去解base64就行了?
但问题是,路径转成的64到了接收方解64后他本地又没有当前路径对应的文件。还是说将这些部分转成byte[]然后base64接着放到流里面对方接收吗?[/quote]
那就5555,图1base64字符串,8888,图2base64字符串.....
发这一整个字符串过去就行了[/quote]
感觉问题越问越复杂,我这么说下,我服务器接受消息,客户端发送信息,然后客户端套接字怎么发送这消息?发的这个字符串还是要放进byte[]才能在服务器接收到流诶[/quote]

//Picture存的是图片二进制数据对应的base64字符串
//发送方处理
var list = new List<C>();
list.Add(new C{Text = "123",Picture = "12314654654897"});
var serialize = JsonConvert.SerializeObject(list);
var buffer = Encoding.UTF8.GetBytes(serialize);
//发送buffer
//接收方处理
var data = Encoding.UTF8.GetString(buffer);
var deserialize = JsonConvert.DeserializeObject<List<C>>(data);
liusa1997 2018-12-26
  • 打赏
  • 举报
回复
引用 30 楼 likelinsiyuan 的回复:
[quote=引用 29 楼 qq_40258437 的回复:]
[quote=引用 28 楼 likelinsiyuan 的回复:]
那这里跟序列化没关系啊,你无非就是发送字符串而已。
区分按顺序用特殊符号隔开不就行了。
5555,图1路径,8888,图2路径.....
接收方取到整个字符串再以逗号分割做处理

你的意思就是,把这些部分全部转成base64然后发给接收方然后接收方去解base64就行了?
但问题是,路径转成的64到了接收方解64后他本地又没有当前路径对应的文件。还是说将这些部分转成byte[]然后base64接着放到流里面对方接收吗?[/quote]
那就5555,图1base64字符串,8888,图2base64字符串.....
发这一整个字符串过去就行了[/quote]
感觉问题越问越复杂,我这么说下,我服务器接受消息,客户端发送信息,然后客户端套接字怎么发送这消息?发的这个字符串还是要放进byte[]才能在服务器接收到流诶
  • 打赏
  • 举报
回复
其实你可以看看#26,
建多个这样的类,按顺序放到集合中序列化,再发送。
加载更多回复(18)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧