如何保存网上的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);
}
}
}
#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