using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Web; using Zhaizj.Framework.Web; using Zhaizj.Framework.Web.Utils; namespace Zhaizj.Framework.Drawing { /// /// 图片常用操作 /// public class Img { private static readonly ILog logger = LogManager.GetLogger( typeof( Img ) ); private static Random rd = new Random(); /// /// 删除图片以及缩略图。如果图片不存在,则忽略 /// /// 相对网址 public static void DeleteImgAndThumb( String srcPath ) { DeleteImgAndThumb( srcPath, Uploader.ThumbTypes ); } /// /// 删除图片以及指定类型的缩略图。如果图片不存在,则忽略 /// /// 相对网址 /// 多个缩略图类型 public static void DeleteImgAndThumb( String srcPath, ThumbnailType[] arrThumbType ) { if (strUtil.IsNullOrEmpty( srcPath )) return; if (srcPath.ToLower().StartsWith( "http://" )) return; String path = PathHelper.Map( srcPath ); if (file.Exists( path )) Zhaizj.Framework.IO.File.Delete( path ); foreach (ThumbnailType ttype in arrThumbType) { String pathThumb = PathHelper.Map( GetThumbPath( srcPath, ttype ) ); if (file.Exists( pathThumb )) Zhaizj.Framework.IO.File.Delete( pathThumb ); } } /// /// 彻底删除磁盘文件 /// /// 相对路径 public static void DeleteFile( String srcPath ) { if (strUtil.IsNullOrEmpty( srcPath )) return; if (srcPath.ToLower().StartsWith( "http://" )) return; String path = PathHelper.Map( srcPath ); if (file.Exists( path )) Zhaizj.Framework.IO.File.Delete( path ); } /// /// 获取图片的随机文件名(会添加日期文件夹和随机文件名),比如 2009-9-28/1530703343314547.jpg /// /// 如果日期文件夹不存在,则在磁盘上自动创建文件夹 /// 图片存储的绝对路径 /// 图片类型 /// 返回图片名称,包括所在文件夹,比如 2009-9-28/1530703343314547.jpg public static String GetPhotoName( String absPath, String strContentType ) { DateTime now = DateTime.Now; String strDir = getDirName( now ); String strRandom = rd.Next( 100000000, 999999999 ).ToString(); String strFile = now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString() + now.Millisecond.ToString() + strRandom; strFile = strUtil.Join( strFile, GetImageExt( strContentType ), "." ); String fullDir = Path.Combine( absPath, strDir ); if (!Directory.Exists( fullDir )) { Directory.CreateDirectory( fullDir ); } return Path.Combine( strDir, strFile ); } //private static string getDirName( DateTime now ) { // return string.Format( "{0}-{1}-{2}", now.Year, now.Month, now.Day ); //} private static string getDirName( DateTime now ) { return string.Format( "{0}/{1}/{2}", now.Year, now.Month, now.Day ); } /// /// 获取文件的随机文件名(会添加日期文件夹和随机文件名),比如 2009-9-28/1530703343314547.zip /// /// 如果日期文件夹不存在,则在磁盘上自动创建文件夹 /// 存储路径 /// 文件类型 /// 返回文件名称,包括所在文件夹,比如 2009-9-28/1530703343314547.zip public static String GetFileName( String pathName, String fileExt ) { DateTime now = DateTime.Now; String strDate = getDirName( now ); String strRandom = rd.Next( 100000000, 999999999 ).ToString(); String strFile = now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString() + now.Millisecond.ToString() + strRandom; strFile = strUtil.Join( strFile, fileExt, "." ); String path = Path.Combine( pathName, strDate ); if (!Directory.Exists( path )) { Directory.CreateDirectory( path ); } return Path.Combine( strDate, strFile ); } /// /// 根据缩略图名称,获取原始图片名称 /// /// /// public static String GetOriginalPath( String thumbPath ) { String path = thumbPath.Trim(); String ext = Path.GetExtension( path ); String pathWithoutExt = strUtil.TrimEnd( path, ext ); if (pathWithoutExt.EndsWith( "_s" )) { return strUtil.TrimEnd( pathWithoutExt, "_s" ) + ext; } if (pathWithoutExt.EndsWith( "_m" )) { return strUtil.TrimEnd( pathWithoutExt, "_m" ) + ext; } if (pathWithoutExt.EndsWith( "_b" )) { return strUtil.TrimEnd( pathWithoutExt, "_b" ) + ext; } return path; } /// /// 根据原始图片名称,获取缩略图名称(最小的缩略图) /// /// /// public static String GetThumbPath( Object srcPath ) { if (srcPath == null) return null; if (strUtil.IsNullOrEmpty( srcPath.ToString() )) return null; return GetThumbPath( srcPath, ThumbnailType.Small ); } /// /// 根据原始图片名称和缩略图类型,获取缩略图名称 /// /// /// /// public static String GetThumbPath( Object srcPath, ThumbnailType ttype ) { if (srcPath == null) return ""; String path = srcPath.ToString(); if (strUtil.IsNullOrEmpty( path )) return ""; String ext = Path.GetExtension( path ); String pathWithoutExt = strUtil.TrimEnd( path, ext ); if (pathWithoutExt.EndsWith( "_s" )) pathWithoutExt = strUtil.TrimEnd( pathWithoutExt, "_s" ); if (pathWithoutExt.EndsWith( "_b" )) pathWithoutExt = strUtil.TrimEnd( pathWithoutExt, "_b" ); if (pathWithoutExt.EndsWith( "_m" )) pathWithoutExt = strUtil.TrimEnd( pathWithoutExt, "_m" ); String suffix = "_s"; if (ttype == ThumbnailType.Medium) suffix = "_m"; else if (ttype == ThumbnailType.Big) suffix = "_b"; return pathWithoutExt + suffix + ext; } /// /// 保存缩略图到磁盘(可指定宽度,默认自动缩放) /// /// /// /// public static void SaveThumbnail( String srcPath, String destPath, int width ) { SaveThumbnail( srcPath, destPath, width, width, SaveThumbnailMode.Auto ); } /// /// 保存缩略图到磁盘(可指定宽高,默认自动缩放) /// /// /// /// /// public static void SaveThumbnail( String srcPath, String destPath, int width, int height ) { SaveThumbnail( srcPath, destPath, width, height, SaveThumbnailMode.Auto ); } /// /// 保存缩略图到磁盘(可指定宽高,可指定缩放模式) /// /// /// /// /// /// public static void SaveThumbnail( String srcPath, String destPath, int width, int height, SaveThumbnailMode mode ) { using (Image srcImg = Image.FromFile( srcPath )) { ThumbSize t = getTargetSize( width, height, mode, srcImg ); using (Bitmap newImg = new Bitmap( t.New.Width, t.New.Height )) { using (Graphics g = Graphics.FromImage( newImg )) { g.InterpolationMode = InterpolationMode.High; g.SmoothingMode = SmoothingMode.HighQuality; g.Clear( Color.Transparent ); g.DrawImage( srcImg, t.getNewRect(), t.getRect(), GraphicsUnit.Pixel ); try { newImg.Save( destPath, ImageFormat.Jpeg ); } catch (Exception e) { throw e; } } } } } /// /// 获取缩略图尺寸 /// /// /// /// /// /// public static ThumbSize getTargetSize( int width, int height, SaveThumbnailMode mode, Image src ) { ThumbSize t = new ThumbSize(); t.Src = new Size( src.Width, src.Height ); t.Point = new Point( 0, 0 ); if (mode == SaveThumbnailMode.ByWidth) { int newHeight = src.Height * width / src.Width; t.New = new Size( width, newHeight ); return t; } else if (mode == SaveThumbnailMode.ByHeight) { int newWidth = src.Width * height / src.Height; t.New = new Size( newWidth, height ); return t; } else if (mode == SaveThumbnailMode.ByWidthHeight) { t.New = new Size( width, height ); return t; } else if (mode == SaveThumbnailMode.Cut) { return getCutSize( width, height, mode, src ); } return getAutoSize( width, height, mode, src ); } private static ThumbSize getAutoSize( int width, int height, SaveThumbnailMode mode, Image src ) { ThumbSize t = new ThumbSize(); t.Src = new Size( src.Width, src.Height ); t.Point = new Point( 0, 0 ); int newWidth = width; int newHeight = height; if ((double)src.Width / (double)src.Height > (double)width / (double)height) newHeight = src.Height * width / src.Width; else newWidth = src.Width * height / src.Height; t.New = new Size( newWidth, newHeight ); return t; } private static ThumbSize getCutSize( int width, int height, SaveThumbnailMode mode, Image src ) { ThumbSize t = new ThumbSize(); if ((double)src.Width / (double)src.Height > (double)width / (double)height) { int newWidth = src.Height * width / height; t.Src = new Size( newWidth, src.Height ); t.New = new Size( width, height ); t.Point = new Point( (src.Width - newWidth) / 2, 0 ); } else { int newHeight = src.Width * height / width; t.Src = new Size( src.Width, newHeight ); t.New = new Size( width, height ); t.Point = new Point( 0, (src.Height - newHeight) / 2 ); } return t; } /// /// 获取图片的后缀名(不包括点号) /// /// /// public static String GetImageExt( String strContentType ) { if (strUtil.IsNullOrEmpty( strContentType )) return null; String t = strContentType.ToLower(); logger.Info( "strContentType=>" + t ); if (t.Equals( ".gif" )) return "gif"; if (t.Equals( ".bmp" )) return "bmp"; if (t.Equals( ".png" )) return "png"; if (t.Equals( ".jpg" )) return "jpg"; if (t.Equals( ".jpeg" )) return "jpeg"; if (t.Equals( "gif" )) return "gif"; if (t.Equals( "bmp" )) return "bmp"; if (t.Equals( "png" )) return "png"; if (t.Equals( "jpg" )) return "jpg"; if (t.Equals( "jpeg" )) return "jpeg"; if (t.Equals( "image/gif")) return "gif"; if (t.Equals( "image/bmp")) return "bmp"; if (t.Equals( "image/tiff")) return "tiff"; if (t.Equals( "image/x-icon")) return "icon"; if (t.Equals( "image/x-png")) return "png"; // ie if (t.Equals( "image/png" )) return "png"; // firefox, google if (t.Equals( "image/x-emf")) return "emf"; if (t.Equals( "image/x-exif")) return "exif"; if (t.Equals( "image/x-wmf")) return "wmf"; if (t.Equals( "image/pjpeg")) return "jpg"; // ie6 if (t.Equals( "image/jpg" )) return "jpg"; // ie8 if (t.Equals( "image/jpeg" )) return "jpg"; // firefox, google return "jpg"; } /// /// 获取图片的类型 /// /// /// public static ImageFormat GetImageType( String strContentType ) { if (strUtil.IsNullOrEmpty( strContentType )) return null; String t = strContentType.ToLower(); if (t.Equals( ".gif" )) return ImageFormat.Gif; if (t.Equals( ".bmp" )) return ImageFormat.Bmp; if (t.Equals( ".png" )) return ImageFormat.Png; if (t.Equals( ".jpg" )) return ImageFormat.Jpeg; if (t.Equals( ".jpeg" )) return ImageFormat.Jpeg; if (t.Equals( "gif" )) return ImageFormat.Gif; if (t.Equals( "bmp" )) return ImageFormat.Bmp; if (t.Equals( "png" )) return ImageFormat.Png; if (t.Equals( "jpg" )) return ImageFormat.Jpeg; if (t.Equals( "jpeg" )) return ImageFormat.Jpeg; if (t.Equals( "image/pjpeg")) return ImageFormat.Jpeg; if (t.Equals( "image/gif")) return ImageFormat.Gif; if (t.Equals( "image/bmp")) return ImageFormat.Bmp; if (t.Equals( "image/tiff")) return ImageFormat.Tiff; if (t.Equals( "image/x-icon")) return ImageFormat.Icon; if (t.Equals( "image/x-png")) return ImageFormat.Png; if (t.Equals( "image/png" )) return ImageFormat.Png; if (t.Equals( "image/x-emf")) return ImageFormat.Emf; if (t.Equals( "image/x-exif")) return ImageFormat.Exif; if (t.Equals( "image/x-wmf")) return ImageFormat.Wmf; return ImageFormat.MemoryBmp; } } }