有谁能解决一下动态图片保存后变成静态图片的怪异问题??真的很怪异!大神在哪??

qty2008 2016-10-26 05:50:58
问题是这样的:用httpwebrequest从网站中获取到一个图片,是动态的gif格式的,获取的图片显示是动态的,但是保存时却发现保存下来的图片是静态的!也就是应该只保存了一层的图层,其它的给丢掉了!我知道一些要说我保存的方法有问题了,方法没问题!方法没问题!方法没问题!重要事情说三遍!请看下面的详细讲解:
我从网站获取到的图片,其中用的一条重要的语句,就是Image img1 = Image.FromStream(stream); 也就是从网站上获取的流直接就是保存到Image中的(注意不是Bitmap!),大家都知道Image类是容纳动态的gif格式的!所以从网站获取到保存在内存的Image里是完全没问题的,因为获取后直接放在图片框(即 pictureBox1.Image = img1)中显示的是动态图片,从这点中也可以说明获取到的图片是完全没问题的。好了,接下来就是保存了,用最简单的直接保存函数:img1.Save(fileName),fileNmae带后缀.gif和不带后缀的都试过,保存后用IE浏览器或是能显示动态图片的软件打开来看,显示的却是却是静态的!!这里可能有人要说保存要用有格式的那个函数!那我就笑了,这个最简单的函数是可以保存C#支持的ImageFormat里的所有格式的,包括动态的gif格式的!也行,然后我还作了用另外的带格式的函数(img1.Sae(fileName, ImageFormat.Gif)保存了一遍,同样文件名fileName用上了带后缀gif和不带后缀的,保存后打开来看,同样的是静态的!
这个事觉得很诡异,因为以前也这样处理过一些别的网站的动态图片,保存下来的就是动态的!然后我发现一个问题:用IE浏览器直接打开这个网站的图片链接地址,显示的是动态,然后右击图片,选择“图片另存为...”时弹出来的格式选项中,只有PNG和BMP,没有Gif!看到这里我突然有个想法,那就是网站对图片动了手脚!没法保存为动态格式的图片!连C#这种直接从流中获取到图片的方式后再保存起来也一样是没办法保存为动态的!不明白为什么还有这么诡异的事情!之所以说诡异,因为我还做了另一件事,保存起来的图片却是动态的!(大家可以去试下,图片的网址是:https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40)
我是这么做的:借助了一个第三方抓包工具Fiddler2,用IE打开图片链接,Fiddler抓到图片的包了,把Fiddler抓到的这个包的内容保存为图片,这个工具很智能,保存时弹出来的保存选项框的默认文件名那里的后缀名赫然写着“.gif”!保存后的图片再打开,这时没错,显示的就是动态的图片了!
然后我还做了一个验证。将这个从Fiddler保存的动态图片读取到pictureBox中显示,动态的,没问题!然后用同样的方法(img1.Save(fileName)再保存,然后再打开这个保存的图片,赫然,这次显示的就是动态图片!!完全没问题!这也验证了上面所说的这个保存的方法是没问题的。
到这里,整个问题的过程我已经讲述得详细了,大家应该没什么疑问了吧?!那么,估计有多人跟我一样,搞不懂为什么这网站的这图片C#的Image能显示动态,但保存时却是静态的??
有没大神能回答一下是怎么回事,以及解决的办法??
...全文
3243 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2016-10-27
  • 打赏
  • 举报
回复
下载的内容本来就是字节流,直接保存就行,不需要用到 Image , 被它一转手就变了,这与是不是从网上下载的没关系.
WM_JAWIN 2016-10-27
  • 打赏
  • 举报
回复
如果你不需要对处图进行处理,就不要使用image.save() 这就是为什么你的图片不动了。 把下载的byte[] 直接保存到磁盘上去,这样你的图片跟网站上的是一样样的,该动的动 如果你要对图片进行处理再保存,据我所知.net 库没有直接支持类。需要针对gif格式,自编写代码。 但在万能的互联网上有好人写好了并分享了成果。只要你自己去找就行了
zj_zwl 2016-10-27
  • 打赏
  • 举报
回复
保存肯定是把流转换成字节数组,没必要用image.save方法
闭包客 2016-10-27
  • 打赏
  • 举报
回复
我可以告诉你,在你不用第三方的编码方法,或者你自己不编写这个编码器的情况下,只要你对 gif 进行了修改,一定只剩下第一帧。 很多 .net 的 web 程序员处理用户上传头像这个环节,把用户上传的 gif 尺寸缩小之后,就剩下第一帧了。
crystal_lz 2016-10-27
  • 打赏
  • 举报
回复

WebClient web = new WebClient();
byte[] byData = web.DownloadData("https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40");
Image.FromStream(new MemoryStream(byData)).Save("test.gif", System.Drawing.Imaging.ImageFormat.Gif);
没有任何问题 如果你要上传 直接到byData就够了 就算你用的是HttpWebRequest 从Response得到一个Stream也能正常 而且 你说了一大堆 却没有看到你贴出来过一行代码 来说明你是怎么去获取的
showjim 2016-10-26
  • 打赏
  • 举报
回复
Image 本来就是一张静态图,GIF 需要特别的组件处理。
qty2008 2016-10-26
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
stream.CopyTo(fs);这句之后,你可以试下Image.FromStream保存下来还是动图么?我没试
终于解决了!虽然不是按你的办法用文件本地再读取的方式,但受到你的一些启发,试了下用分段写入内存的方式,也就是保存到文件的那种用字节写入流的方式,测试发现居然可以了! 终于发现一个问题了,stream = respond.GetResponseStream(); Image img1 = Image.FromStream(stream); 通过这方式直接弄到的图片,对某些像这种动态图片保存时会变成态静态的问题!而直接显示却没问题!原因是什么还是不得而知啊!有谁知道的可以说一下,到时会给分的。如果没有到谁能解答的,两天后本贴关闭,分数全部给starfd这位兄弟。
qty2008 2016-10-26
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
string url = @"https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (var stream = response.GetResponseStream())
{
    FileStream fs = new FileStream("D:/files.gif", FileMode.Create, FileAccess.Write);
    stream.CopyTo(fs);
    fs.Flush();
    fs.Close();
}
你这个在本质上跟是跟用WebClient的方式是一样的,都是直接流保存为文件形式的。不过这种办法倒是可以解决Cookie的问题,但还是我第一次跟你说的,每次每个图片都这样保存在本直再读取,很烦琐也费时。你应该明白我所说问题的诡异之处,为什么流写入到内存再保存时,有些Gif能保存为动态的,有些像这种的却不行?其中是什么原因?怎么去解决?有办法像我在5楼所说去解决么?
  • 打赏
  • 举报
回复
stream.CopyTo(fs);这句之后,你可以试下Image.FromStream保存下来还是动图么?我没试
Poopaye 2016-10-26
  • 打赏
  • 举报
回复
byte[] response;
HttpRequest(@"https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40", new byte[0], out response);
Image img = Image.FromStream(new MemoryStream(response));
img.Save(@"e:\a.gif");
动态的,没问题
  • 打赏
  • 举报
回复
string url = @"https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (var stream = response.GetResponseStream())
{
    FileStream fs = new FileStream("D:/files.gif", FileMode.Create, FileAccess.Write);
    stream.CopyTo(fs);
    fs.Flush();
    fs.Close();
}
qty2008 2016-10-26
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
string url = @"https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40";
WebClient client = new WebClient();
client.DownloadFile(url, "D:/file.gif");
下载下来是动图
简单点也就是说,希望要用的办法是这样的:用httpwebrequest获取到的图片保存在内存的Image里,对这个Image经过一些处理后,再保存时能够恢复为正常的动态图片。我怀疑是图片里包含了一些描述的数据(或者说成是限制数据?),使得用Image.Save保存时不能保存完整的动态图片,如果能将这些限制的数据清除掉,保存的图片就会是动态图片,就像用Fiddler2抓包保存下来的动态图片,导入pictureBox后再用Image.Save保存时就是动态图片,也就是说Fiddler抓的包保存的图片就应该是去除掉限制的数据后的图片。但问题是不知道限制在哪里,要怎么操作去除这些限制
qty2008 2016-10-26
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
string url = @"https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40";
WebClient client = new WebClient();
client.DownloadFile(url, "D:/file.gif");
下载下来是动图
client直接下载的方式没试过,但由于编程的问题,不方便这样用。同时,因为保存在本地只是为了便于说明,其实我不需要保存在本地上的,获取到的图片是需要上传的,上传后由远程的进行保存等操作处理的。每个图片都这样在本地上保存一下再读取,不但烦琐,而且还浪费时间等问题。 请问你以前遇到这样的情况么,有什么解决的办法?不要用你这种方式的,我用的是httpwebrequest的方式,还获取网站其它的网页,不仅仅是这个图片的问题,不可能单获为了获取这个图片再另外用上这个WebClient的方式的,因为Cookie等问题到时操作很麻烦的。
  • 打赏
  • 举报
回复
string url = @"https://www.bxjr.com/router/common/captcha?v=0.05104222495067395&w=undefined&h=40";
WebClient client = new WebClient();
client.DownloadFile(url, "D:/file.gif");
下载下来是动图
qty2008 2016-10-26
  • 打赏
  • 举报
回复
大神在哪??求救求救!!
qty2008 2016-10-26
  • 打赏
  • 举报
回复
有没人能解答一下???!!!

111,076

社区成员

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

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

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