| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- using System;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.Drawing.Imaging;
- namespace Y.Utils.Net20.ImageUtils
- {
- public class ImageTool
- {
- /// <summary>
- /// 生成缩略图
- /// </summary>
- /// <param name="originalImagePath">源图路径(物理路径)</param>
- /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
- /// <param name="width">缩略图宽度</param>
- /// <param name="height">缩略图高度</param>
- /// <param name="mode">生成缩略图的方式</param>
- public static bool MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
- {
- Image originalImage = 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 "HW"://指定高宽缩放(可能变形)
- break;
- case "W"://指定宽,高按比例
- toheight = originalImage.Height * width / originalImage.Width;
- break;
- case "H"://指定高,宽按比例
- towidth = originalImage.Width * height / originalImage.Height;
- break;
- case "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图片
- Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
- //新建一个画板
- Graphics g = System.Drawing.Graphics.FromImage(bitmap);
- //设置高质量插值法
- g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
- //设置高质量,低速度呈现平滑程度
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- //清空画布并以透明背景色填充
- g.Clear(Color.Transparent);
- //在指定位置并且按指定大小绘制原图片的指定部分
- g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
- new Rectangle(x, y, ow, oh),
- GraphicsUnit.Pixel);
- try
- {
- //以jpg格式保存缩略图
- bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
- return true;
- }
- catch (System.Exception e)
- {
- return false;
- //throw e;
- }
- finally
- {
- originalImage.Dispose();
- bitmap.Dispose();
- g.Dispose();
- }
- }
-
- /// <summary>
- /// 逆时针旋转图像
- /// </summary>
- /// <param name="originalImagePath">原始图像路径</param>
- /// <param name="saveImagePath">保存图像的路径</param>
- /// <param name = "angle" > 旋转角度[0, 360](前台给的) </ param >
- /// <returns></returns>
- public static bool RotateImg(string originalImagePath, string saveImagePath, int angle)
- {
- Image originalImage = Image.FromFile(originalImagePath);
- angle = angle % 360;
- //弧度转换
- double radian = angle * Math.PI / 180.0;
- double cos = Math.Cos(radian);
- double sin = Math.Sin(radian);
- //原图的宽和高
- int w = originalImage.Width;
- int h = originalImage.Height;
- int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
- int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
- //目标位图
- Bitmap saveImage = new Bitmap(W, H);
- Graphics g = Graphics.FromImage(saveImage);
- g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- //计算偏移量
- Point Offset = new Point((W - w) / 2, (H - h) / 2);
- //构造图像显示区域:让图像的中心与窗口的中心点一致
- Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);
- Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
- g.TranslateTransform(center.X, center.Y);
- g.RotateTransform(360 - angle);
- //恢复图像在水平和垂直方向的平移
- g.TranslateTransform(-center.X, -center.Y);
- g.DrawImage(originalImage, rect);
- //重至绘图的所有变换
- g.ResetTransform();
- g.Save();
- //保存旋转后的图片
- originalImage.Dispose();
- try
- {
- saveImage.Save(saveImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
- return true;
- }
- catch (Exception e) { return false; }
- finally
- {
- originalImage.Dispose();
- saveImage.Dispose();
- g.Dispose();
- }
- }
- /// 无损压缩图片
- /// <param name="sFile">原图片</param>
- /// <param name="dFile">压缩后保存位置</param>
- /// <param name="dHeight">高度</param>
- /// <param name="dWidth"></param>
- /// <param name="flag">压缩质量(数字越小压缩率越高) 1-100</param>
- /// <returns></returns>
- public static bool GetPicThumbnail(string sFile, string dFile, int dHeight, int dWidth, int flag)
- {
- Image iSource = Image.FromFile(sFile);
- ImageFormat tFormat = iSource.RawFormat;
- int sW = 0, sH = 0;
- //按比例缩放
- Size tem_size = new Size(iSource.Width, iSource.Height);
- if (tem_size.Width > dHeight || tem_size.Width > dWidth)
- {
- if ((tem_size.Width * dHeight) > (tem_size.Width * dWidth))
- {
- sW = dWidth;
- sH = (dWidth * tem_size.Height) / tem_size.Width;
- }
- else
- {
- sH = dHeight;
- sW = (tem_size.Width * dHeight) / tem_size.Height;
- }
- }
- else
- {
- sW = tem_size.Width;
- sH = tem_size.Height;
- }
- Bitmap ob = new Bitmap(dWidth, dHeight);
- Graphics g = Graphics.FromImage(ob);
- g.Clear(Color.WhiteSmoke);
- g.CompositingQuality = CompositingQuality.HighQuality;
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.InterpolationMode = InterpolationMode.HighQualityBicubic;
- g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
- g.Dispose();
- //以下代码为保存图片时,设置压缩质量
- EncoderParameters ep = new EncoderParameters();
- long[] qy = new long[1];
- qy[0] = flag;//设置压缩的比例1-100
- EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
- ep.Param[0] = eParam;
- try
- {
- ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
- ImageCodecInfo jpegICIinfo = null;
- for (int x = 0; x < arrayICI.Length; x++)
- {
- if (arrayICI[x].FormatDescription.Equals("JPEG"))
- {
- jpegICIinfo = arrayICI[x];
- break;
- }
- }
- if (jpegICIinfo != null)
- {
- ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
- }
- else
- {
- ob.Save(dFile, tFormat);
- }
- return true;
- }
- catch
- {
- return false;
- }
- finally
- {
- iSource.Dispose();
- ob.Dispose();
- }
- }
- }
- }
|