首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

怎么保存网下的gif动画图片到本地

2012-12-17 
如何保存网上的gif动画图片到本地?本帖最后由 jasonpeng2 于 2012-11-28 23:22:52 编辑刚学C#,写了个web程

如何保存网上的gif动画图片到本地?
本帖最后由 jasonpeng2 于 2012-11-28 23:22:52 编辑 刚学C#,写了个web程序,主要的用途是要用于采集网上的资源到本地。。
复制网页的html到文本框后,通过正则分析出了网上img元素的src地址,然后保存远程图片到本地。。
这里有个问题就是保存jpg、png等静态图片时正常,而保存下来gif的动画,只有一帧,变成了静态图片,请各位童鞋帮帮忙,有没有保存远程gif动画到本地的方法?
下面贴上我现在使用的保存图片的部分源码:
.cs文件代码:


            // 保存的本地的文件名开头和目录,以年月日时分秒毫秒的格式来命名,示例:20121122131745123
            string strSaveName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string strSaveDir = "/pic/collect/" + strSaveName;
            string strHostAdr = Request.UserHostAddress;
            string strI;
            Person ps = new Person();

            if (!strHostAdr.StartsWith("http://"))
            {
                strHostAdr = "http://" + strHostAdr;
            }

            // 保存远程的宝贝图片到本地,这里各个图片是用“;”隔开的
            string strItemImgs = txtItemImgs.Text;

            string[] strsItemImg = strItemImgs.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            Dictionary<string, string> dictItemImg = new Dictionary<string, string>();

            if (strsItemImg.Length > 0)
            {
                for (int i = 0; i < strsItemImg.Length; i++)
                {
                    // 判断数组中的远程图片地址是否已经存在于dictionary泛型数组中,不存在才添加并下载到本地,避免重复下载相同的图片
                    if (!dictItemImg.ContainsKey(strsItemImg[i]))
                    {
                        if (i < 10)
                        {
                            strI = "0" + i;
                        }
                        else


                        {
                            strI = i.ToString();
                        }
                        string strLocalImageUrl = ps.DownRemoteImg(strSaveDir, strsItemImg[i], strSaveName + "_item_" + strI);
                        dictItemImg.Add(strsItemImg[i], strHostAdr + strLocalImageUrl);
                    }
                }
            }



自定义的Person类代码:

#region 下载远程图片保存到本地
        /// <summary>
        /// 下载远程图片保存到本地
        /// </summary>
        /// <param name="saveDir">本地保存路径</param>
        /// <param name="imgUrl">远程图片地址</param>
        /// <param name="imgName">保存的图片名称。。为空字符串时,则以远程图片文件的名称来命名</param>
        /// <returns>保存后的本地图片相对路径</returns>
        public string DownRemoteImg(string saveDir, string imgUrl, string imgName)
        {
            if (string.IsNullOrEmpty(imgUrl))
                return string.Empty;
            else
            {
                //string imgName = string.Empty;
                string imgExt = string.Empty;       // 图片的扩展名
                string saveFilePath = string.Empty; // 保存的路径
                string fileFullPath = string.Empty; // 保存的文件完整的路径

                // 图片扩展名:示例:.jpg
              // 部分图片网址,存在特殊格式,不带扩展名,需作出判断
                if (imgUrl.EndsWith(".jpg") || imgUrl.EndsWith(".gif") || imgUrl.EndsWith(".png") || imgUrl.EndsWith(".bmp"))
                {


                    imgExt = imgUrl.Substring(imgUrl.LastIndexOf("."), imgUrl.Length - imgUrl.LastIndexOf("."));
                }
                else
                {
                    imgExt = ".jpg";
                }

                // 没有设置图片名称时,以远程的图片名称来命名,示例:/aaa.jpg
                if (imgName == "")
                {
                    imgName = imgUrl.Substring(imgUrl.LastIndexOf("/"), imgUrl.Length - imgUrl.LastIndexOf("/"));
                }
                else
                {
                    imgName = "/" + imgName + imgExt;
                }
                imgName = imgName.Trim('/');    // 取文件名,示例:aaa.jpg

                saveFilePath = HttpContext.Current.Server.MapPath(saveDir);
                // 保存的目录不存时,则创建目录
                if (!Directory.Exists(saveFilePath))
                {
                    Directory.CreateDirectory(saveFilePath);
                }

                // 如果文件存在,先删除,以实现新文件覆盖旧文件
                fileFullPath = saveFilePath + "\" + imgName;   // 格式:D:\output\aaa.jpg
                File.Delete(fileFullPath);

                try
                {
                    WebRequest wreq = WebRequest.Create(imgUrl);
                    wreq.Timeout = 10000;


                    HttpWebResponse wresp = (HttpWebResponse)wreq.GetResponse();
                    Stream s = wresp.GetResponseStream();
                    System.Drawing.Image img;
                    img = System.Drawing.Image.FromStream(s);
                    switch (imgExt.ToLower())
                    {
                        case ".gif":
                            img.Save(fileFullPath, ImageFormat.Gif);
                            break;
                        case ".jpg":
                        case ".jpeg":
                            img.Save(fileFullPath, ImageFormat.Jpeg);
                            break;
                        case ".png":
                            img.Save(fileFullPath, ImageFormat.Png);
                            break;
                        case ".icon":
                            img.Save(fileFullPath, ImageFormat.Icon);
                            break;
                        case ".bmp":
                            img.Save(fileFullPath, ImageFormat.Bmp);
                            break;
                    }



                    img.Dispose();
                    s.Dispose();
                    if (saveDir != "")
                    {
                        if (!saveDir.EndsWith("/"))
                        {
                            saveDir = saveDir + "/";
                        }
                    }

                    return saveDir + imgName;
                }
                catch
                {
                    return imgUrl;
                }
            }
        }
        #endregion


[最优解释]
try 不要直接img.fromstream
先把stream 直接读下来再说

[其他解释]
可以说得详细点吗?我刚学一段时间,还不太熟,保存图片的代码也是网上找的自己再修改一下拿来用的。
[其他解释]
感谢hdt的提示,我在网上找到方法了。改用FileStream的方法来保存就可以了。。
结贴。。
[其他解释]
这里我找到的示例,有同样问题的童鞋也可以研究一下。
http://www.cnblogs.com/wenpi51/archive/2008/11/14/1333392.html

热点排行