当前位置:编程学习 > C#/ASP.NET >>

C# socket bmp传输

各位大神求援助,
我最近在写两个主机间的图片传输模块,用socket传bmp图片。
1.先将bmp图片转为byte[]
2.传到另一主机,再由byte[]转为bmp
但是在第二部中出现问题:Bitmap bm = (Bitmap)Image.FromStream(ms);//报参数无效错误
(代码改为传jpg文件没问题,但是bmp就出现参数无效问题)

发送端(bmp-byte[]):

byte[][] msgPicBytes = new byte[picFiles.Length][];
Bitmap pic = new Bitmap("文件路径");
MemoryStream ms = new MemoryStream();
pic.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
msgPicBytes[j] = ms.GetBuffer();

接收端(byte[]-bmp):

byte[] bytelist = picBytes;
MemoryStream ms = new MemoryStream(bytelist);
Bitmap bm = (Bitmap)Image.FromStream(ms);
bm.Save(@"E:\images\hello.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
ms.Close();
bm.Dispose();
c# socket bmp 图片传输 --------------------编程问答-------------------- 最大大可能就是你的传输步骤有问题。
既,msgPicBytes[j]和bytelist不一样(很可能长度就不一样)。

作个试验很容易:
int length = msgPicBytes[j].Length;
Console.WriteLine("Sending {0} bytes", length);


int length = picBytes.Length;
Console.WriteLine("Processing {0} bytes", length);

--------------------编程问答-------------------- 不是这个问题,我验证过了,传输前后的大小是一样的。。。 --------------------编程问答-------------------- 而且我之前尝试的第一步是另一种方法,但是都只是jpg没问题,bmp出问题:

FileStream fs = new FileStream("图片路径", FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fs);
msgPicBytes[j] = new byte[fs.Length];
reader.Read(msgPicBytes[j], 0, msgPicBytes[j].Length);
--------------------编程问答-------------------- Bitmap pic = new Bitmap("文件路径")
;MemoryStream ms = new MemoryStream();
不要用pic.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
改成用FileStream或者BinaryReader读取试试 --------------------编程问答-------------------- msgPicBytes[j] = ms.GetBuffer();
换成:
msgPicBytes[j] = ms.ToArray();

两个大小有差别,具体看参考。 --------------------编程问答-------------------- 其实,也不需要Bitmap和MemorStream过一手。
直接:
msgPicBytes[j] = File.ReadAllBytes("文件路径");
...
File.SaveAllBytes(@"E:\images\hello.bmp", picBytes);



--------------------编程问答-------------------- 当我全部改为filestream的时候,发现jpg和bmp都能传。传完的大小和传之前一样,但是jpg传完后可以正确打开。但是bmp的图片是无效图片(虽然接收前后的文件大小一样) --------------------编程问答-------------------- 呵呵,Image.Save 针对 MemoryStream 是有一定的问题的。

告诉你一个非常成熟的做法,正是因为Image的Save、Load并不匹配,所以在很多开源软件里专门为Image单独开发了序列化和反序列化方法(仅支持.net到.net传送)。其实很简单,就是采取二进制序列化,把Image变为byte[]。然后另一边再采取二进制反序列化。

你会发现,这根本不纠结什么Image.Save、Image.Load,也不需要奢侈地动用什么磁盘文件。 --------------------编程问答-------------------- Image -->  Bitmap



引用 6 楼 gomoku 的回复:
其实,也不需要Bitmap和MemorStream过一手。
原本,这个问题应该解决一边的Bitmap完全正常地传到另一边再可绘制的问题,根本不应该涉及磁盘文件。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,