tif文件下载 保存成图片,或图片保存
来源:互联网 发布:mac 命令行下载文件 编辑:程序博客网 时间:2024/05/22 00:29
1.环境:从另一台服务器上抓取tif 文件和图片,保存到本地服务器,其中tif 文件需要拆分成单个图片保存,tif文件是从ftp上得到的。
遇到的过的问题:
a.因都是网络图片,考虑的是在线抓取直接将流转化成图片,然后在保存图片.
关键代码:
if (url.StartsWith("http:") )|| url.StartsWith("ftp:")) { System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); System.Net.WebResponse webres = webreq.GetResponse(); Stream stream = webres.GetResponseStream(); img = Image.FromStream(stream); stream.Close(); }
问题:文件过大会占有内存过大,导致内存溢出而报错。方案:先下载保存到本地
b.文件保存到本地后,读取文件使用的是Image.FromFile(path),此方法会占有文件,导致无法操作文件。
方案:根据下载后的本地地址先转化成数据流且仅只具有读取数据的权限,再创建图片
关键代码:
img = null; string path = Download(baseUrl, ClaimNumber, url); if (!string.IsNullOrEmpty(path)) { FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); int byteLength = (int)fileStream.Length; byte[] fileBytes = new byte[byteLength]; fileStream.Read(fileBytes, 0, byteLength); //文件流关閉,文件解除锁定 fileStream.Close(); img = Image.FromStream(new MemoryStream(fileBytes)); //img = Image.FromFile(path);//会占用文件 System.IO.File.Delete(path);// }
c.tif 文件拆分成图片。
关键代码:
if (url.EndsWith("tif")) { Guid guid = (Guid)img.FrameDimensionsList.GetValue(0); FrameDimension dimension = new FrameDimension(guid); int totalPage = img.GetFrameCount(dimension); string total = "共" + totalPage + "页"; for (int i = 0; i < totalPage; i++) { ExtClaimFilesInfo info = new ExtClaimFilesInfo(); info.ClaimNumber = ClaimNumber; img.SelectActiveFrame(dimension, i); string name = string.Format("{0}_{1}", ClaimNumber, i); info.Path1 = UploadFile("claimData", name, dt, img);//原图,缩略图 info.VisitIndex = 1; info.OpTime = DateTime.Now; list.Add(info); } }d.图片处理:本地保存缩略图和原图,若原图>500K 再压缩原图(j尽可能的保持原图清晰度)。
关键代码:
/// <summary> /// 原图大于500k 压缩图片 /// </summary> /// <param name="path">原图图片路径</param> /// <param name="pathnew">压缩后图片路径</param> public bool OriginalNail(string path,string pathnew) { bool suc = false; if (!string.IsNullOrEmpty(path)) { try { if (File.Exists(pathnew)) { File.Delete(pathnew); } FileInfo fi = new FileInfo(path); Int64 len = fi.Length;//图片大小 decimal cnt = CHC.Common.Tools.CalcDivide(len, 1024); if (cnt > 500) { CHC.Common.Picture.MakeThumbnail(path, pathnew, 1200, 120, "W"); fi.Delete(); } else { fi.MoveTo(pathnew); } suc = true; } catch (Exception ex) { CHC.DAL.Log.Loger.Error(ex, "原图大于500k 压缩图片异常"); } } return suc; }2.具体代码:
a.生成缩略图 封装类:Picture
public class Picture { /**/ /// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)</param> /// <param name="thumbnailPath">缩略图路径(物理路径)</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode) { Image originalImage = Image.FromFile(originalImagePath); MakeThumbnail(thumbnailPath, width, height, mode, originalImage); } public static void MakeThumbnail(string thumbnailPath, int width, int height, string mode, Stream stream) { Image originalImage = new Bitmap(stream); MakeThumbnail(thumbnailPath, width, height, mode, originalImage); } private static void MakeThumbnail(string thumbnailPath, int width, int height, string mode, Image originalImage) { int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case "HW"://指定高宽缩放(可能变形) break; case "W"://指定宽,高按比例 toheight = originalImage.Height * width / originalImage.Width; break; case "H"://指定高,宽按比例 towidth = originalImage.Width * height / originalImage.Height; break; case "Cut"://指定高宽裁减(不变形) if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) { oh = originalImage.Height; ow = originalImage.Height * towidth / toheight; y = 0; x = (originalImage.Width - ow) / 2; } else { ow = originalImage.Width; oh = originalImage.Width * height / towidth; x = 0; y = (originalImage.Height - oh) / 2; } break; default: break; } //新建一个bmp图片 Image bitmap = new System.Drawing.Bitmap(towidth, toheight); //新建一个画板 Graphics g = System.Drawing.Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(Color.Transparent); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel); try { //以jpg格式保存缩略图 bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg); } catch (System.Exception e) { throw e; } finally { originalImage.Dispose(); bitmap.Dispose(); g.Dispose(); } } }
b.根据路径和图片保存图片 封装方法:UploadFile
private string UploadFile(string folder,string name,DateTime? dt, Image img) { DateTime dt1 = dt.HasValue ? dt.Value : DateTime.Now; //string baseUrl = System.Web.HttpContext.Current.Server.MapPath("~/"); string type1 = "original", type2 = "compress"; ; //原型图路径 string customUrl = string.Format("\\upload\\{0}\\{1}\\{2}", folder, dt1.ToString("yyyyMMdd"), type1); if (!System.IO.Directory.Exists(baseUrl + customUrl)) System.IO.Directory.CreateDirectory(baseUrl + customUrl); string path = customUrl + "\\" + name + ".Jpeg"; string path1 = customUrl + "\\" + name+"tmp" + ".Jpeg"; string suoUrl = string.Format("\\upload\\{0}\\{1}\\{2}", folder, dt1.ToString("yyyyMMdd"), type2); if (!System.IO.Directory.Exists(baseUrl + suoUrl)) System.IO.Directory.CreateDirectory(baseUrl + suoUrl); string suopath = suoUrl + "\\" + name + ".Jpeg"; //原型图保存 img.Save(baseUrl + path1, System.Drawing.Imaging.ImageFormat.Jpeg); OriginalNail(baseUrl + path1, baseUrl + path); //缩略图 CHC.Common.Picture.MakeThumbnail(baseUrl + path, baseUrl + suopath, 120, 120, "Cut"); return suopath.Replace("\\", "/"); ; }
c.原图大于500k 压缩图片 封装方法:OriginalNail
/// <summary> /// 原图大于500k 压缩图片 /// </summary> /// <param name="path">原图图片路径</param> /// <param name="pathnew">压缩后图片路径</param> public bool OriginalNail(string path,string pathnew) { bool suc = false; if (!string.IsNullOrEmpty(path)) { try { if (File.Exists(pathnew)) { File.Delete(pathnew); } FileInfo fi = new FileInfo(path); Int64 len = fi.Length;//图片大小 decimal cnt = CHC.Common.Tools.CalcDivide(len, 1024); if (cnt > 500) { CHC.Common.Picture.MakeThumbnail(path, pathnew, 1200, 120, "W"); fi.Delete(); } else { fi.MoveTo(pathnew); } suc = true; } catch (Exception ex) { CHC.DAL.Log.Loger.Error(ex, "原图大于500k 压缩图片异常"); } } return suc; }
d.实现ftp下载文件操作 封装方法:Download ,ftp:url中已填入帐号和秘密,则程序中无需配置。
/// <summary> /// 实现ftp下载操作 /// </summary> /// <param name="filePath">保存到本地的文件名</param> /// <param name="fileName">远程文件名</param> public string Download(string filePath, string ClaimNumber, string url) { FtpWebRequest reqFTP; //判断临时目录是否存在 if (!System.IO.Directory.Exists(filePath)) System.IO.Directory.CreateDirectory(filePath); string str = string.Empty; try { str = filePath + "\\" + ClaimNumber + ".tif"; reqFTP = (FtpWebRequest)FtpWebRequest.Create(url); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; //reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);//已放在url中 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); FileStream outputStream = new FileStream(str, FileMode.Create); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); } catch (Exception ex) { str = string.Empty; CHC.DAL.Log.Loger.Log(ex, string.Format("保存tif文件到本地异常,url:{0},ClaimNumber:{1}", url, ClaimNumber)); } return str; }e.最终调用方法:---tif文件下载 保存成图片,或图片保存
/// <summary> /// tif文件下载 保存成图片,或图片保存 /// </summary> /// <param name="url"></param> public List<ExtClaimFilesInfo> Downtif(string url, string ClaimNumber,DateTime? dt) { List<ExtClaimFilesInfo> list = new List<ExtClaimFilesInfo>(); try { if (!string.IsNullOrEmpty(url)) { Image img ; if (url.StartsWith("http:") )//|| url.StartsWith("ftp:"))//网络图片,ftp 文件太大,先下载到本地 { System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); System.Net.WebResponse webres = webreq.GetResponse(); Stream stream = webres.GetResponseStream(); img = Image.FromStream(stream); stream.Close(); } else if (url.StartsWith("ftp:")) { img = null; string path = Download(baseUrl, ClaimNumber, url); if (!string.IsNullOrEmpty(path)) { FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); int byteLength = (int)fileStream.Length; byte[] fileBytes = new byte[byteLength]; fileStream.Read(fileBytes, 0, byteLength); //文件流关閉,文件解除锁定 fileStream.Close(); img = Image.FromStream(new MemoryStream(fileBytes)); //img = Image.FromFile(path);//会占用文件 System.IO.File.Delete(path);// } } else { img = Image.FromFile(url);//本地图片 } if (img != null) { if (url.EndsWith("tif")) { Guid guid = (Guid)img.FrameDimensionsList.GetValue(0); FrameDimension dimension = new FrameDimension(guid); int totalPage = img.GetFrameCount(dimension); string total = "共" + totalPage + "页"; for (int i = 0; i < totalPage; i++) { ExtClaimFilesInfo info = new ExtClaimFilesInfo(); info.ClaimNumber = ClaimNumber; img.SelectActiveFrame(dimension, i); string name = string.Format("{0}_{1}", ClaimNumber, i); info.Path1 = UploadFile("claimData", name, dt, img);//原图,缩略图 info.VisitIndex = 1; info.OpTime = DateTime.Now; list.Add(info); } } else { ExtClaimFilesInfo info = new ExtClaimFilesInfo(); info.ClaimNumber = ClaimNumber; Random rad = new Random(); string _newname = DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + rad.Next(100, 100000000).ToString(); string name = string.Format("{0}_{1}", ClaimNumber, _newname); info.Path1 = UploadFile("claimData", name, dt, img);//原图,缩略图 info.VisitIndex = 1; info.OpTime = DateTime.Now; list.Add(info); } } GC.Collect(); } } catch (Exception ex) { //throw ex; CHC.DAL.Log.Loger.Log(ex, string.Format("图片下载异常,url:{0},ClaimNumber:{1}", url, ClaimNumber)); } return list; }
阅读全文
0 0
- tif文件下载 保存成图片,或图片保存
- 将多幅图片保存到多帧文件(.tif)中
- 使用URLConnection下载文件或图片并保存到本地
- 使用urlconnection下载文件或图片并保存到本地
- 使用urlconnection下载文件或图片并保存到本地
- 下载图片并保存
- 保存下载的图片
- MVC 保存二进制到数据库,并显示文件的方法(图片显示或下载文件)
- Canvas图保存成图片或pdf
- 保存图片到文件
- Java 使用urlconnection下载文件或图片并保存到本地
- java提高篇(41)--urlconnection下载文件或图片并保存到本地
- AS3下载并保存图片
- 从服务器下载保存图片
- GCD下载保存图片 缓存
- 图片的下载和保存
- scrapy 下载并保存图片
- Oracle数据库保存、下载图片
- google protocol buffer基础学习总结(java版)
- json解析
- 反编译war包 jar
- php获取省市数组
- 心情
- tif文件下载 保存成图片,或图片保存
- 数组反序列化
- cocos安卓打包出现的:未指定Android目标平台
- 自定义dialogfragment实现底部弹出框效果
- bst平衡树
- Dialect class not found
- 【模板】莫队 (模板题:洛谷P2009HH的项链)
- Win7系统电脑将鼠标停留在桌面图标上不出现提示信息的原因及解决方法图文教程
- linux系统中usr/bin/ld被误删/覆盖解决方案