压缩图片C#算法
jopen
11年前
using System.IO; using System.Drawing; using System.Drawing.Imaging; using System; namespace Bll { /// <summary> /// 图片处理类 /// 1、生成缩略图片或按照比例改变图片的大小和画质 /// 2、将生成的缩略图放到指定的目录下 /// </summary> public class ImageHepler { public Image ResourceImage, ReducedImage; private int ImageWidth; private int ImageHeight; public string ErrMessage; /// <summary> /// 类的构造函数 /// </summary> /// <param name="ImageFileName">图片文件的全路径名称</param> public ImageHepler(string ImageFileName) { ResourceImage = Image.FromFile(ImageFileName); ErrMessage = ""; } public bool ThumbnailCallback() { return false; } /// <summary> /// 生成缩略图,返回缩略图的Image对象 /// </summary> /// <param name="Width">缩略图的宽度</param> /// <param name="Height">缩略图的高度</param> /// <returns>缩略图的Image对象</returns> public Image GetReducedImage(int Width, int Height) { double LengthLong; //存储(长和宽中)较短的长度 int widthOK, heightOK; //存储实际要生成的图片的长宽 if (Width < Height) //判断输入的长和宽那个较短 { LengthLong = Width; //把较短的存储在 LengthLonh 用于计算 } else { LengthLong = Height; } try { //判断原图片 长和宽 //原图比较长的一个边要和缩略图的边相等 if (ResourceImage.Width > ResourceImage.Height) { widthOK = (int)LengthLong; heightOK = (int)(LengthLong / ResourceImage.Width * ResourceImage.Height); } else { heightOK = (int)LengthLong; widthOK = (int)LengthLong / ResourceImage.Height * ResourceImage.Width; } Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ReducedImage = ResourceImage.GetThumbnailImage(widthOK, heightOK, callb, IntPtr.Zero); return ReducedImage; } catch (Exception e) { ErrMessage = e.Message; return null; } } /// <summary> /// 生成缩略图,将缩略图文件保存到指定的路径 /// </summary> /// <param name="Width">缩略图的宽度</param> /// <param name="Height">缩略图的高度</param> /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:\Images\filename.jpg</param> /// <returns>成功返回true,否则返回false</returns> public bool GetReducedImage(int Width, int Height, string targetFilePath) { double LengthLong; //存储(长和宽中)较短的长度 int widthOK, heightOK; //存储实际要生成的图片的长宽 if (Width < Height) //判断输入的长和宽那个较短 { LengthLong = Width; //把较短的存储在 LengthLonh 用于计算 } else { LengthLong = Height; } try { //判断原图片 长和宽 //原图比较长的一个边要和缩略图的边相等 if (ResourceImage.Width > ResourceImage.Height) { widthOK = (int)LengthLong; heightOK = (int)(LengthLong / ResourceImage.Width * ResourceImage.Height); } else { heightOK = (int)LengthLong; widthOK = (int)LengthLong / ResourceImage.Height * ResourceImage.Width; } Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ReducedImage = ResourceImage.GetThumbnailImage(widthOK, heightOK, callb, IntPtr.Zero); ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg); //ReducedImage.Dispose(); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } /// <summary> /// 生成缩略图,返回缩略图的Image对象 /// </summary> /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param> /// <returns>缩略图的Image对象</returns> public Image GetReducedImage(double Percent) { try { Image ReducedImage; Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent); ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); return ReducedImage; } catch (Exception e) { ErrMessage = e.Message; return null; } } /// <summary> /// 生成缩略图,返回缩略图的Image对象 /// </summary> /// <param name="Percent">缩略图的宽度百分比 如:需要百分之80,就填0.8</param> /// <param name="targetFilePath">缩略图保存的全文件名,(带路径),参数格式:D:\Images\filename.jpg</param> /// <returns>成功返回true,否则返回false</returns> public bool GetReducedImage(double Percent, string targetFilePath) { try { Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); ImageWidth = Convert.ToInt32(ResourceImage.Width * Percent); ImageHeight = Convert.ToInt32(ResourceImage.Width * Percent); ReducedImage = ResourceImage.GetThumbnailImage(ImageWidth, ImageHeight, callb, IntPtr.Zero); ReducedImage.Save(@targetFilePath, ImageFormat.Jpeg); //ReducedImage.Dispose(); return true; } catch (Exception e) { ErrMessage = e.Message; return false; } } } }
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.IO; using System.Collections; using System.Collections.Generic; using System.Security.AccessControl; using System.Security.Permissions; namespace Bll { public class FolderHelper { //判断文件夹是否存在 public static bool checkFolderExits(string path) { DirectoryInfo dir = new DirectoryInfo(path); if (dir.Exists)//文件夹存在 { return true; } else { //dir.Create();//不存在就创建一个 return false; } } //创建一个文件夹,存在就创建失败 public static bool CreateNewFolder(string path) { DirectoryInfo dir = new DirectoryInfo(path); if (!dir.Exists) { dir.Create(); return true; } else return false; } /// <summary> /// 在指定目录下创建指定名称文件夹 /// </summary> /// <param name="ParentsPath"></param> /// <param name="NewFolderName"></param> /// <returns></returns> public static bool CreateNewFolder(string ParentsPath, string NewFolderName) { string CreatePath = ParentsPath + @"\" + NewFolderName; DirectoryInfo dir = new DirectoryInfo(CreatePath); if (!dir.Exists) { dir.Create(); return true; } else return false; } /// <summary> /// 返回目录下的所有文件名 /// </summary> /// <param name="path"></param> /// <returns></returns> public static ArrayList getAllFiles(string path) { DirectoryInfo dir = new DirectoryInfo(path); if (dir.Exists) { FileInfo[] fileinfo = dir.GetFiles(); ArrayList list = new ArrayList(); foreach (FileInfo f in fileinfo) { list.Add(f.Name); } return list; } else return null; } /// <summary> /// 计算文件夹的大小 /// </summary> /// <param name="d"></param> /// <returns></returns> public static long DirSize(DirectoryInfo d) { long Size = 0; // Add file sizes. FileInfo[] fis = d.GetFiles();//获得目录文件列表 foreach (FileInfo fi in fis) { Size += fi.Length; } // Add subdirectory sizes. DirectoryInfo[] dis = d.GetDirectories();//获取目录子目录列表 foreach (DirectoryInfo di in dis) { Size += DirSize(di); } return Size; } /// <summary> /// 把文件夹得大小转换成比较合适的表示单位 /// </summary> /// <param name="size"></param> /// <returns></returns> public static string ViewSize(long size) { long m=size; string viewstr; if ((m / 1024) > 0)//表示可以转换成KB { m = m / 1024;//转换成KB if ((m / 1024) > 0)//表示可以转换成MB { m = m / 1024;//转换成MB了 if ((m / 1024) > 0)//表示可以转换成GB { m = m / 1024;//转换成GB了 viewstr = m.ToString() + "GB"; } else { viewstr = m.ToString() + "MB"; } } else { viewstr = m.ToString() + "KB"; } } else { viewstr = m.ToString() + "byte"; } return viewstr; } /// <summary> /// 删除指定目录和内容 /// </summary> /// <param name="dir"></param> /// <returns></returns> public static bool delDir(string dir) { bool flag = false; DirectoryInfo d = new DirectoryInfo(dir); if (d.Exists)//判断目录是否存在 { try { d.Delete(); flag = true; } catch (Exception e) { flag = false; } } return flag; } /// <summary> /// 删除指定文件 /// </summary> /// <param name="fil"></param> /// <returns></returns> public static bool delFile(string fil) { bool flag = false; FileInfo d = new FileInfo(fil); if (d.Exists)//判断目录是否存在 { try { d.Delete(); flag = true; } catch (Exception e) { flag = false; } } return flag; } public static void Copy(string sourceDirectory, string targetDirectory) { DirectoryInfo diSource = new DirectoryInfo(sourceDirectory); DirectoryInfo diTarget = new DirectoryInfo(targetDirectory); CopyAll(diSource, diTarget); } /// <summary> /// 复制目录及子文件到指定目录 /// </summary> /// <param name="source"></param> /// <param name="target"></param> public static void CopyAll(DirectoryInfo source, DirectoryInfo target) { // Check if the target directory exists, if not, create it. if (Directory.Exists(target.FullName) == false) { Directory.CreateDirectory(target.FullName); } // Copy each file into it's new directory. foreach (FileInfo fi in source.GetFiles()) { Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name); fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true); } // Copy each subdirectory using recursion. foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) { DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name); CopyAll(diSourceSubDir, nextTargetSubDir); } } /// <summary> /// 循环读取某个目录下的所有文件和目录,查询有关每一项的一些信息。返回一个文件列表 /// </summary> /// <param name="strCurrentDir"></param> public static List<fileEntity> FileView(string strCurrentDir) { List<fileEntity> fileList = new List<fileEntity>(); DirectoryInfo dir = new DirectoryInfo(strCurrentDir); foreach (FileSystemInfo fsi in dir.GetFileSystemInfos())//这个循环再读取文件的信息 { try { //FileSystemInfo 对象可以表示文件或目录,从而可以作为 FileInfo 或 DirectoryInfo 对象的基础。 当分析许多文件和目录时,请使用该基类。 FileInfo fi; DirectoryInfo di; //创建一个自己写的实体类的实体 fileEntity newfile = new fileEntity(); if (fsi is FileInfo)//外层循环读取文件信息 { //表示当前fsi是文件 fi = (FileInfo)fsi; newfile.fileName = fi.Name; newfile.fileExt = fi.Extension; newfile.fileSize = fi.Length; newfile.FileModify = fi.LastWriteTime; //通过扩展名来选择文件显示图标 switch (newfile.fileExt) { case ".gif": newfile.picName = "gif.gif"; break; default: newfile.picName = "other.gif"; break; } newfile.picName = "<img src='" + newfile.picName + "' width=25 height=20>"; } else { di = (DirectoryInfo)fsi; newfile.fileName = di.Name; newfile.fileSize = DirSize(di);//调用计算文件夹大小的方法 newfile.FileModify = di.LastWriteTime; newfile.picName = "<img src='directory.gif' width=25 height=20>"; } fileList.Add(newfile); } catch (Exception e) { } } return fileList; } /// <summary> /// 显示目录和文件 /// </summary> /// <param name="path"></param> public static void All(string path) { FileInfo fi;//文件 DirectoryInfo di;//目录 DirectoryInfo dir=null; int i = 0; //控制行的颜色 try { dir = new DirectoryInfo(path); } catch (Exception e) { } foreach (FileSystemInfo fsi in dir.GetFileSystemInfos()) { try { fileEntity newfile = new fileEntity(); FolderEntity folder = new FolderEntity(); newfile.fileName = ""; newfile.picName = ""; newfile.fileExt = ""; newfile.fileSize = 0; folder.folderName = ""; folder.picName = ""; i += 1; if (fsi is FileInfo)//判断当前读取的是不是一个文件 { //表示当前fsi是文件 fi = (FileInfo)fsi; newfile.fileName = fi.Name; newfile.fileExt = fi.Extension; newfile.fileSize = fi.Length; newfile.FileModify = fi.LastWriteTime; //将文件加上可以下载文件的链接 newfile.fileName = "<a href='........'></a>"; //通过扩展名来选择文件显示图标 //Response.Write(Session["DataBasePath"].ToString()+"\\filetype\\"+pfun.getFileExt(FileExt)+".gif"); if (fsi.Exists) { switch (newfile.fileExt) { case ".gif": newfile.picName = "gif.gif"; break; default: newfile.picName = "other.gif"; break; } } else { newfile.picName = "unknown.gif"; } /* switch(FileExt) { case ".gif": FilePic = "gif.gif"; break; default: FilePic = "other.gif"; break; } */ newfile.picName = "<img src='filetype/" + newfile.picName + "' width=16 height=16>"; } else { //当前为目录 di = (DirectoryInfo)fsi; folder.folderName = di.Name; //给目录加上链接 folder.folderName = "<a href='.......'><a>"; folder.lastTime = di.LastWriteTime; folder.picName = "<img src='filetype/folder.gif' width=16 height=16>"; } }catch(Exception e){} } } } }