Example #1
0
 public static Byte[] GetnerateThumnail(int width, int height, ThumbnailGenMode mode, Byte[] oriImgByte)
 {
     byte[] result = null;
     using (var stream = new MemoryStream(oriImgByte))
     {
         var oriImg         = Image.FromStream(stream);
         var waterMarkedImg = getnerateThumnail(width, height, mode, oriImg);
         using (MemoryStream ms = new MemoryStream())
         {
             waterMarkedImg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
             result = ms.ToArray();
         }
     }
     return(result);
 }
Example #2
0
        private static Image getnerateThumnail(int width, int height, ThumbnailGenMode mode, System.Drawing.Image originalImage)
        {
            int towidth  = width;
            int toheight = height;
            int x        = 0;
            int y        = 0;
            int ow       = originalImage.Width;
            int oh       = originalImage.Height;

            switch (mode)
            {
            case ThumbnailGenMode.HW:    //指定高宽缩放(可能变形)
                break;

            case ThumbnailGenMode.W:    //指定宽,高按比例
                toheight = originalImage.Height * width / originalImage.Width;
                break;

            case ThumbnailGenMode.H:    //指定高,宽按比例
                towidth = originalImage.Width * height / originalImage.Height;
                break;

            case ThumbnailGenMode.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;

            case ThumbnailGenMode.Auto:      //自动调整
                // 根据源图及欲生成的缩略图尺寸,计算缩略图的实际尺寸及其在"画布"上的位置
                if (toheight * originalImage.Width > towidth * originalImage.Height)
                {
                    toheight = originalImage.Height * width / originalImage.Width;
                    y        = (height - toheight) / 2;
                }
                else
                {
                    towidth = originalImage.Width * height / originalImage.Height;
                    x       = (width - towidth) / 2;
                }
                break;

            case ThumbnailGenMode.Exiu:
                // 宽高都小于原图
                if (width <= originalImage.Width && height <= originalImage.Height || width > originalImage.Width && height > originalImage.Height)
                {
                    // 以缩放比最小的为准
                    if ((double)width / (double)originalImage.Width < (double)height / (double)originalImage.Height)
                    {
                        toheight = originalImage.Height * width / originalImage.Width;
                    }
                    else
                    {
                        towidth = originalImage.Width * height / originalImage.Height;
                    }
                }
                // 宽度较小原图的
                if (width <= originalImage.Width && height > originalImage.Height)
                {
                    towidth = originalImage.Width * height / originalImage.Height;
                }
                // 高度较小的
                if (width > originalImage.Width && height <= originalImage.Height)
                {
                    toheight = originalImage.Height * width / originalImage.Width;
                }
                break;

            default:
                break;
            }

            Image bitmap = null;

            if (mode == ThumbnailGenMode.Auto)
            {
                bitmap = new System.Drawing.Bitmap(width, height);
            }
            else
            {
                bitmap = new System.Drawing.Bitmap(towidth, toheight);
            }
            //新建一个画板
            using (var 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);
                if (mode == ThumbnailGenMode.Auto)
                {
                    // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(originalImage, new Rectangle(x, y, towidth, toheight), new Rectangle(0, 0, ow, oh), GraphicsUnit.Pixel);
                }
                else
                {
                    //在指定位置并且按指定大小绘制原图片的指定部分
                    g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
                }
            }
            return(bitmap);
        }
Example #3
0
 /// <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, ThumbnailGenMode mode)
 {
     using (var originalImage = System.Drawing.Image.FromFile(originalImagePath))
     {
         using (var bitmap = getnerateThumnail(width, height, mode, originalImage))
         {
             //以jpg格式保存缩略图
             bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
         }
     }
 }