怎么将字节数组转换成图片保存

.Net技术 码拜 9年前 (2015-03-25) 1785次浏览 0个评论

我现在有个摄像头发送指令后我将返回的数据全部保存在一个数组里,这个数组长度是我自己定义的,怎么将长度设定刚好等于返回字节数啊
            byte[] RecieveByte = new byte[10240];           
            sendSocket.Receive(RecieveByte);
现在我想把这些字节转换成图片并保存,请问该怎么转换呢,我查了下百度,用的这段代码,现在提示ms参数无效,我不知道怎么处理了,哪位大哥指点下(数组里现在是十进制数据,图片开头是255 216,也就是FF D8)
        private Image byteArrayToImage(byte[] Bytes)
        {
            Image photo = null;
            MemoryStream ms = new MemoryStream(Bytes);
           
            ms.Write(Bytes, 0, Bytes.Length);
            photo = Image.FromStream(ms, true);
            return photo;
        }

怎么将字节数组转换成图片保存
5分
不要传入Bytes.Length,你应该传入数据真正的长度,而不是把整个数组长度都写进去
怎么将字节数组转换成图片保存
int count=sendSocket.Receive(RecieveByte);
可以获取收到多少字节数的
怎么将字节数组转换成图片保存
而且你应该把协议做的更好一些,不要直接传图片文件流
起始4个字节写入后续总长度
收到后判断一下是否相符
这样如果收到的数据不完整就丢弃重发好了,不要把不完整的数据也转图片,一定会出错的
怎么将字节数组转换成图片保存
35分
第一个问题,“怎么将长度设定刚好等于返回字节数啊”:
这个要用一个循环来接,直到接完所有的数据为止。可以查看 http://msdn.microsoft.com/en-us/library/6y0e13d3(v=vs.110).aspx
pre class=”brush: csharp”>   while (true) { // while循环,不断的接取数据
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes,0,bytesRec); // 这个地方不需要。直接用FileStream把接到的byte数据写到图片文件就可以。
                    if (data.IndexOf(“<EOF>”) > -1) { // 接收完毕,跳出
                        break;
                    }
                }
/pre>
第二个问题,如何转成图片。
我觉得不需要在内存里再new 一个memory stream。 在while循环外面new一个FileStream对象,然后在while循环内部把接到的byte数组写到文件里。
/div>
怎么将字节数组转换成图片保存
引用 4 楼 SPFarm 的回复:

第一个问题,“怎么将长度设定刚好等于返回字节数啊”:
这个要用一个循环来接,直到接完所有的数据为止。可以查看 http://msdn.microsoft.com/en-us/library/6y0e13d3(v=vs.110).aspx
pre class=”brush: csharp”>   while (true) { // while循环,不断的接取数据
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes,0,bytesRec); // 这个地方不需要。直接用FileStream把接到的byte数据写到图片文件就可以。
                    if (data.IndexOf(“<EOF>”) > -1) { // 接收完毕,跳出
                        break;
                    }
                }
/pre>
第二个问题,如何转成图片。
我觉得不需要在内存里再new 一个memory stream。 在while循环外面new一个FileStream对象,然后在while循环内部把接到的byte数组写到文件里。

 data += Encoding.ASCII.GetString(bytes,0,bytesRec); // 这个地方不需要。直接用FileStream把接到的byte数据写到图片文件就可以。这个替换的该怎么写呢?我换成流的,依然提示参数无效

怎么将字节数组转换成图片保存
引用 5 楼 zzl0223 的回复:
Quote: 引用 4 楼 SPFarm 的回复:

第一个问题,“怎么将长度设定刚好等于返回字节数啊”:
这个要用一个循环来接,直到接完所有的数据为止。可以查看 http://msdn.microsoft.com/en-us/library/6y0e13d3(v=vs.110).aspx
pre class=”brush: csharp”>   while (true) { // while循环,不断的接取数据
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes,0,bytesRec); // 这个地方不需要。直接用FileStream把接到的byte数据写到图片文件就可以。
                    if (data.IndexOf(“<EOF>”) > -1) { // 接收完毕,跳出
                        break;
                    }
                }
/pre>
第二个问题,如何转成图片。
我觉得不需要在内存里再new 一个memory stream。 在while循环外面new一个FileStream对象,然后在while循环内部把接到的byte数组写到文件里。

 data += Encoding.ASCII.GetString(bytes,0,bytesRec); // 这个地方不需要。直接用FileStream把接到的byte数据写到图片文件就可以。这个替换的该怎么写呢?我换成流的,依然提示参数无效

首先在while(true) 外面定义一个filestream:
  FileStream fs = new FileStream(“c:\abc.jpg”, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite);
然后在接收部分,把那句话改成  fs.Write(bytes, 0, bytesRec);
最后在while(true)外面,把fs close掉。
试试吧。            

怎么将字节数组转换成图片保存
还有就是跳出条件,因为那句话不要了,所以跳出条件
 if (data.IndexOf(“<EOF>”) > -1) { // 接收完毕,跳出
                        break;
                    }
要改成:
if(bytesRec==0)
{
   break;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么将字节数组转换成图片保存
喜欢 (1)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!