image.fromstream() 方法失败,求解

qq664282970 2013-02-19 12:59:39
...全文
360 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-02-19
  • 打赏
  • 举报
回复
反编译了下那个方法,那个为非托管代码在处理的结果,而且似乎只有Bmp格式才会这样,说明它不是按照顺序写入流的,最后写完的位置就是那个中间位置,由于看不到那部分的代码,所以只能知道它不是处理完所有数据后再写入的,而是分段读取并写入。可能是因为Bmp格式不需要进行编码解码的缘故,其它格式要保证完整性,就必须完整的加载并写入。
qq664282970 2013-02-19
  • 打赏
  • 举报
回复
引用 12 楼 qldsrx 的回复:
不知所云,你倒底是哪段代码指向了流的中间位置?Position和Length属性不一样?save后肯定是指向末尾的,那样的流要被读取,肯定是什么都读不到的,不重定位流的位置,就读不到任何东西,“流”就是这么一个由当前位置走下去的一个概念,写入或读取它都不管位置,只从当前开始处理,因此中断了都无所谓,位置由“流”自身来记录。
Bitmap bmp = new Bitmap(@"C:\Users\Lenovo\Desktop\新建文件夹\eee.bmp"); MemoryStream memo=new MemoryStream(); bmp.Save(memo,System.Drawing.Imaging.ImageFormat.Bmp); MessageBox.Show(memo.Position.ToString());//输出的值为182 MessageBox.Show(memo.Length.ToString()); //输出的值为4150 为啥memo的position是182而不是4150 还是说memo流的末尾就是182.
qldsrx 2013-02-19
  • 打赏
  • 举报
回复
引用 11 楼 qq664282970 的回复:
总结下吧,image.fromstream(stream)这个函数不需要stream的position为零。可能在执行时自动会把stream的position属性修改为零。 而image.save(stream,format)这个函数运行后会修改stream的position属性值。所以如果想把这个流的内容拷贝到另一个流时需要先把positon设置为零后再拷贝。 ……
看了下源码,fromstream方法会内部记录当前流的位置,等处理完毕还原那个位置,真的是会偷鸡
qldsrx 2013-02-19
  • 打赏
  • 举报
回复
不知所云,你倒底是哪段代码指向了流的中间位置?Position和Length属性不一样?save后肯定是指向末尾的,那样的流要被读取,肯定是什么都读不到的,不重定位流的位置,就读不到任何东西,“流”就是这么一个由当前位置走下去的一个概念,写入或读取它都不管位置,只从当前开始处理,因此中断了都无所谓,位置由“流”自身来记录。
qq664282970 2013-02-19
  • 打赏
  • 举报
回复
总结下吧,image.fromstream(stream)这个函数不需要stream的position为零。可能在执行时自动会把stream的position属性修改为零。 而image.save(stream,format)这个函数运行后会修改stream的position属性值。所以如果想把这个流的内容拷贝到另一个流时需要先把positon设置为零后再拷贝。 谢谢 qldsrx,lye2000000_super,版主大家的帮助!
qq664282970 2013-02-19
  • 打赏
  • 举报
回复
按照qldsrx 所说的,重新测试了下,成功运行了。 image.save(stream,format.bmp)运行完后。position指向了流的中间位置,所以读取数据并写入另一个内存流时内容不一致了。 但是还有个疑问。为啥image.save()执行后position没指向流的末尾呢,而是指向了中间的一个位置。
  • 打赏
  • 举报
回复
引用 7 楼 qldsrx 的回复:
直接Image.FromFile更好,你居然要转弯,至于失败的原因是你没有重定位stream的Position到0,在你刚写入到stream后,Position指向了流的末尾,这种情况下加载它必定失败。
需要调用stream.Seek(0, SeekOrigin.Begin); 然后再FromStream。
qq664282970 2013-02-19
  • 打赏
  • 举报
回复
我这个原始程序是想利用套接字网络传送内存图片(不是本地图片)的。 改成下面也不行,仍然提示参数无效。可messagebox显示两个流的大小都为4150. 并不为空。 但是代码简化成下面是可成功运行。
qldsrx 2013-02-19
  • 打赏
  • 举报
回复
直接Image.FromFile更好,你居然要转弯,至于失败的原因是你没有重定位stream的Position到0,在你刚写入到stream后,Position指向了流的末尾,这种情况下加载它必定失败。
  • 打赏
  • 举报
回复
直接Image.FromFile不行吗?何必再去转一道手续?
  • 打赏
  • 举报
回复
有必要这么复杂吗?直接取的不就行了?
qq664282970 2013-02-19
  • 打赏
  • 举报
回复
异常提示是(参数无效)。我觉得不是字节长度的问题,因为之前用filestream从文件里读取数据流,然后用memorystream可以读取出图片内容来。 或者哪位可以帮我写个类似的程序段啊!
  • 打赏
  • 举报
回复
catch一下异常。。 byteArray = new byte[memStream.Length]; 然后再往里读试试。。
stonespace 2013-02-19
  • 打赏
  • 举报
回复
把具体的异常贴出来,
threenewbee 2013-02-19
  • 打赏
  • 举报
回复
你确定这个图像是2048字节么?如果图片格式不对或者不完整,就会有这个异常。

110,536

社区成员

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

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

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