Files
lserp_cs_5.0/插件库/Zhaizj.Framework/Drawing/Img.cs
T
2026-07-10 15:25:05 +08:00

398 lines
15 KiB
C#

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 {
/// <summary>
/// 图片常用操作
/// </summary>
public class Img {
private static readonly ILog logger = LogManager.GetLogger( typeof( Img ) );
private static Random rd = new Random();
/// <summary>
/// 删除图片以及缩略图。如果图片不存在,则忽略
/// </summary>
/// <param name="srcPath">相对网址</param>
public static void DeleteImgAndThumb( String srcPath ) {
DeleteImgAndThumb( srcPath, Uploader.ThumbTypes );
}
/// <summary>
/// 删除图片以及指定类型的缩略图。如果图片不存在,则忽略
/// </summary>
/// <param name="srcPath">相对网址</param>
/// <param name="arrThumbType">多个缩略图类型</param>
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 );
}
}
/// <summary>
/// 彻底删除磁盘文件
/// </summary>
/// <param name="srcPath">相对路径</param>
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 );
}
/// <summary>
/// 获取图片的随机文件名(会添加日期文件夹和随机文件名),比如 2009-9-28/1530703343314547.jpg
/// </summary>
/// <remarks>如果日期文件夹不存在,则在磁盘上自动创建文件夹</remarks>
/// <param name="pathName">图片存储的绝对路径</param>
/// <param name="strContentType">图片类型</param>
/// <returns>返回图片名称,包括所在文件夹,比如 2009-9-28/1530703343314547.jpg</returns>
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 );
}
/// <summary>
/// 获取文件的随机文件名(会添加日期文件夹和随机文件名),比如 2009-9-28/1530703343314547.zip
/// </summary>
/// <remarks>如果日期文件夹不存在,则在磁盘上自动创建文件夹</remarks>
/// <param name="pathName">存储路径</param>
/// <param name="fileExt">文件类型</param>
/// <returns>返回文件名称,包括所在文件夹,比如 2009-9-28/1530703343314547.zip</returns>
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 );
}
/// <summary>
/// 根据缩略图名称,获取原始图片名称
/// </summary>
/// <param name="thumbPath"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 根据原始图片名称,获取缩略图名称(最小的缩略图)
/// </summary>
/// <param name="srcPath"></param>
/// <returns></returns>
public static String GetThumbPath( Object srcPath ) {
if (srcPath == null) return null;
if (strUtil.IsNullOrEmpty( srcPath.ToString() )) return null;
return GetThumbPath( srcPath, ThumbnailType.Small );
}
/// <summary>
/// 根据原始图片名称和缩略图类型,获取缩略图名称
/// </summary>
/// <param name="srcPath"></param>
/// <param name="ttype"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 保存缩略图到磁盘(可指定宽度,默认自动缩放)
/// </summary>
/// <param name="srcPath"></param>
/// <param name="destPath"></param>
/// <param name="width"></param>
public static void SaveThumbnail( String srcPath, String destPath, int width ) {
SaveThumbnail( srcPath, destPath, width, width, SaveThumbnailMode.Auto );
}
/// <summary>
/// 保存缩略图到磁盘(可指定宽高,默认自动缩放)
/// </summary>
/// <param name="srcPath"></param>
/// <param name="destPath"></param>
/// <param name="width"></param>
/// <param name="height"></param>
public static void SaveThumbnail( String srcPath, String destPath, int width, int height ) {
SaveThumbnail( srcPath, destPath, width, height, SaveThumbnailMode.Auto );
}
/// <summary>
/// 保存缩略图到磁盘(可指定宽高,可指定缩放模式)
/// </summary>
/// <param name="srcPath"></param>
/// <param name="destPath"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="mode"></param>
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;
}
}
}
}
}
/// <summary>
/// 获取缩略图尺寸
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="mode"></param>
/// <param name="src"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取图片的后缀名(不包括点号)
/// </summary>
/// <param name="strContentType"></param>
/// <returns></returns>
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";
}
/// <summary>
/// 获取图片的类型
/// </summary>
/// <param name="strContentType"></param>
/// <returns></returns>
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;
}
}
}