我们在实际项目开发过程中,曾经遇到过一个需求,就是要开发一个对大量图片进行整理(删除掉一些不符合要求的图片)、归类(根据格式进行分类,比如jpg格式、bmp格式等)、压缩(因为有的图片很大很占空间,看能否在保证清晰可辨、尺寸适中的前提下,适当的压缩掉一部分空间)的小程序。这里只是重点分享一下如何对图片进行压缩。 我们也不是水平非常高的图像处理专家,但是实际项目中又有这个需求,作为普通的程序员应该如何满足这个要求呢? 很显然,最简单的思路就是适当的缩小原图的尺寸大小或者是适当的降低原图的质量要求,这样就能有效地降低原图所占的空间。 先上一个程序的截图: 我们通过选择图片的原目录以及目标目录,设置好压缩大小和压缩质量,点击开始压缩按钮,即可进行批量图片压缩。 在图片的原目录选择当中,能够遍历根目录下的所有图片(包括子目录下的图片)。 好了,很简单的一个界面,下面我们直接上几段核心代码: [csharp]viewplaincopy ///summary ///压缩图片方法 ////summary ///paramname="sourcePath"原目录/param ///paramname="targetPath"目标目录/param ///returns压缩是否成功/returns privateboolCompressPicture(stringsourcePath,stringtargetPath) { try { doublesizeRate=double.Parse(cbSizeRate.Text)/;//大小比率 intqualityRate=int.Parse(cbQualityRate.Text);//品质比率 ImagesourceImage=Image.FromFile(sourcePath); //调整图片大小 Bitmapbmp=newBitmap(sourceImage,newSize((int)(sourceImage.Width*sizeRate),(int)(sourceImage.Height*sizeRate))); //压缩图片 SaveAsJPEG(bmp,targetPath,qualityRate); GC.Collect(); returntrue; } catch { returnfalse; } } [csharp]viewplaincopy ///summary ///保存为JPEG格式,支持压缩质量选项 ////summary ///paramname="bmp"原始位图/param ///paramname="FileName"新文件地址/param ///paramname="Qty"压缩质量,越大越好,文件也越大(0-)/param ///returns成功标志/returns publicstaticboolSaveAsJPEG(Bitmapbmp,stringFileName,intQty) { try { EncoderParameterp; EncoderParametersps; ps=newEncoderParameters(1); p=newEncoderParameter(System.Drawing.Imaging.Encoder.Quality,Qty); ps.Param[0]=p; bmp.Save(FileName,GetCodecInfo("image/jpeg"),ps); returntrue; } catch { returnfalse; } } [csharp]viewplaincopy ///summary ///保存JPG时用 ////summary ///paramname="mimeType"/param ///returns得到指定mimeType的ImageCodecInfo/returns privatestaticImageCodecInfoGetCodecInfo(stringmimeType) { ImageCodecInfo[]CodecInfo=ImageCodecInfo.GetImageEncoders(); foreach(ImageCodecInfoiciinCodecInfo) { if(ici.MimeType==mimeType)returnici; } returnnull; } [csharp]viewplaincopy ///summary ///遍历文件 ////summary ///paramname="info"/param publicvoidListFiles(FileSystemInfoinfo) { if(!info.Exists)return; DirectoryInfodir=infoasDirectoryInfo; if(dir==null)return; FileSystemInfo[]files=dir.GetFileSystemInfos(); for(inti=0;ifiles.Length;i++) { FileInfofile=files[i]asFileInfo; if(file!=nullfile.Name.Trim().LastIndexOf(".")-1) { if(file.Name.Substring(file.Name.LastIndexOf(".")).ToUpper()==".JPG") { this.lvSourceFolderList.Items.Add(file.FullName); imageList.Add(file.FullName); } } else { ListFiles(files[i]);//对于子目录,进行递归调用 } } } 源代码下载北京哪家医院治疗白癜风比较好白癜风治疗中心
|