/********************************************** * 類作用: 圖片處理類 * 作者: 開優網絡 ***********************************************/ using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using System.IO; namespace Svnhost.Common { public enum ThumbnailMode { HW, W, H, Cut }; /// <summary> /// 圖片實用類 /// </summary> public sealed class ImageUtil { private ImageUtil() { } public static string[] postion = new string[] { "WM_TOP_LEFT", "WM_TOP_RIGHT", "WM_TOP_MIDDLE", "WM_BOTTOM_RIGHT", "WM_BOTTOM_LEFT", "WM_BOTTOM_MIDDLE" }; /// <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, ThumbnailMode mode) { System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath); int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case ThumbnailMode.HW://指定高寬縮放(可能變形) break; case ThumbnailMode.W://指定寬,高按比例 toheight = originalImage.Height * width / originalImage.Width; break; case ThumbnailMode.H://指定高,寬按比例 towidth = originalImage.Width * height / originalImage.Height; break; case ThumbnailMode.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圖片 System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight); //新建一個畫板 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); //設置高質量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //設置高質量,低速度呈現平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空畫布并以透明背景色填充 g.Clear(System.Drawing.Color.Transparent); //在指定位置并且按指定大小繪制原圖片的指定部分 g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.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(); } } /// <summary> /// 加水印圖片 /// </summary> /// <param name="picture">imge 對象</param> /// <param name="WaterMarkPicPath">水印圖片的地址</param> /// <param name="_watermarkPosition">水印位置</param> /// <param name="_width">被加水印圖片的寬</param> /// <param name="_height">被加水印圖片的高</param> public static void addWatermarkImage(Graphics picture, string WaterMarkPicPath, string _watermarkPosition, int _width, int _height) { Image watermark = new Bitmap(WaterMarkPicPath); int xpos = 0; int ypos = 0; int w = watermark.Width; int h = watermark.Height; switch (_watermarkPosition) { case "WM_TOP_LEFT": xpos = 0 + 10; ypos = 0 + 10; break; case "WM_TOP_RIGHT": xpos = _width - w - 10; ypos = 0 + 10; break; case "WM_BOTTOM_RIGHT": xpos = _width - w - 10; ypos = _height - h - 10; break; case "WM_BOTTOM_LEFT": xpos = 0 + 10; ypos = _height - h - 10; break; case "WM_BOTTOM_MIDDLE": xpos = _width / 2 - w / 2; ypos = _height - h - 10; break; case "WM_TOP_MIDDLE": xpos = _width / 2 - w / 2; ypos = 0 + 10; break; } picture.DrawImage(watermark, xpos, ypos, w, h); watermark.Dispose(); } /// <summary> /// 打水印 /// </summary> /// <param name="img"></param> /// <param name="saveFile">保存文件路徑</param> /// <param name="logoFile">LOGO文件地址</param> public static void MakeLogo(Image img, string saveFile, string logoFile) { using (System.Drawing.Image logo = System.Drawing.Image.FromFile(logoFile)) { if (img.Width < logo.Width || img.Height < logo.Height) img.Save(saveFile); else { Graphics g = System.Drawing.Graphics.FromImage(img); Random r = new Random(); g.DrawImage(logo, img.Width - logo.Width - r.Next(img.Width - logo.Width), img.Height - logo.Height - r.Next(img.Height - logo.Height), logo.Width, logo.Height); g.Save(); img.Save(saveFile); g.Dispose(); } logo.Dispose(); } } #region 圖片壓縮(降低質量)Compress private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCodecInfo[] encoders; encoders = ImageCodecInfo.GetImageEncoders(); for (j = 0; j < encoders.Length; ++j) { if (encoders[j].MimeType == mimeType) return encoders[j]; } return null; } /// <summary> /// 圖片壓縮(降低質量以減小文件的大小) /// </summary> /// <param name="srcBitmap">傳入的Bitmap對象</param> /// <param name="destStream">壓縮后的Stream對象</param> /// <param name="level">壓縮等級,0到100,0 最差質量,100 最佳</param> public static void Compress(Bitmap srcBitmap, Stream destStream, long level) { ImageCodecInfo myImageCodecInfo; Encoder myEncoder; EncoderParameter myEncoderParameter; EncoderParameters myEncoderParameters; // Get an ImageCodecInfo object that represents the JPEG codec. myImageCodecInfo = GetEncoderInfo("image/jpeg"); // Create an Encoder object based on the GUID // for the Quality parameter category. myEncoder = Encoder.Quality; // Create an EncoderParameters object. // An EncoderParameters object has an array of EncoderParameter // objects. In this case, there is only one // EncoderParameter object in the array. myEncoderParameters = new EncoderParameters(1); // Save the bitmap as a JPEG file with 給定的 quality level myEncoderParameter = new EncoderParameter(myEncoder, level); myEncoderParameters.Param[0] = myEncoderParameter; srcBitmap.Save(destStream, myImageCodecInfo, myEncoderParameters); } /// <summary> /// 圖片壓縮(降低質量以減小文件的大小) /// </summary> /// <param name="srcBitMap">傳入的Bitmap對象</param> /// <param name="destFile">壓縮后的圖片保存路徑</param> /// <param name="level">壓縮等級,0到100,0 最差質量,100 最佳</param> public static void Compress(Bitmap srcBitMap, string destFile, long level) { Stream s = new FileStream(destFile, FileMode.Create); Compress(srcBitMap, s, level); s.Close(); } /// <summary> /// 圖片壓縮(降低質量以減小文件的大小) /// </summary> /// <param name="srcFile">傳入的Stream對象</param> /// <param name="destFile">壓縮后的圖片保存路徑</param> /// <param name="level">壓縮等級,0到100,0 最差質量,100 最佳</param> public static void Compress(Stream srcStream, string destFile, long level) { Bitmap bm = new Bitmap(srcStream); Compress(bm, destFile, level); bm.Dispose(); } /// <summary> /// 圖片壓縮(降低質量以減小文件的大小) /// </summary> /// <param name="srcFile">傳入的Image對象</param> /// <param name="destFile">壓縮后的圖片保存路徑</param> /// <param name="level">壓縮等級,0到100,0 最差質量,100 最佳</param> public static void Compress(Image srcImg, string destFile, long level) { Bitmap bm = new Bitmap(srcImg); Compress(bm, destFile, level); bm.Dispose(); } /// <summary> /// 圖片壓縮(降低質量以減小文件的大小) /// </summary> /// <param name="srcFile">待壓縮的BMP文件名</param> /// <param name="destFile">壓縮后的圖片保存路徑</param> /// <param name="level">壓縮等級,0到100,0 最差質量,100 最佳</param> public static void Compress(string srcFile, string destFile, long level) { // Create a Bitmap object based on a BMP file. Bitmap bm = new Bitmap(srcFile); Compress(bm, destFile, level); bm.Dispose(); } #endregion 圖片壓縮(降低質量) } }