如何保存网上的gif动画图片到本地?

jasonpeng2 2012-11-28 11:21:04
刚学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
...全文
5941 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasonpeng2 2012-11-29
  • 打赏
  • 举报
回复
这里我找到的示例,有同样问题的童鞋也可以研究一下。 http://www.cnblogs.com/wenpi51/archive/2008/11/14/1333392.html
jasonpeng2 2012-11-29
  • 打赏
  • 举报
回复
感谢hdt的提示,我在网上找到方法了。改用FileStream的方法来保存就可以了。。 结贴。。
jasonpeng2 2012-11-28
  • 打赏
  • 举报
回复
可以说得详细点吗?我刚学一段时间,还不太熟,保存图片的代码也是网上找的自己再修改一下拿来用的。
真相重于对错 2012-11-28
  • 打赏
  • 举报
回复
try 不要直接img.fromstream 先把stream 直接读下来再说

62,241

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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