예제 #1
0
        /// <summary>
        /// Resize the image to the specified width and height.
        /// 指定长宽裁剪
        /// 按模版比例最大范围的裁剪图片并缩放至模版尺寸
        /// </summary>
        /// <param name="image">The image to resize.</param>
        /// <param name="width">The width to resize to.</param>
        /// <param name="height">The height to resize to.</param>
        /// <returns>The resized image.</returns>
        public static System.Drawing.Bitmap CustomImage(System.Drawing.Image initImage, int maxWidth, int maxHeight)
        {
            //a holder for the result
            Bitmap result = new Bitmap(maxWidth, maxHeight);

            //set the resolutions the same to avoid cropping due to resolution differences
            result.SetResolution(initImage.HorizontalResolution, initImage.VerticalResolution);

            //use a graphics object to draw the resized image into the bitmap
            using (Graphics graphics = Graphics.FromImage(result))
            {
                //模版的宽高比例
                double templateRate = (double)maxWidth / maxHeight;
                //原图片的宽高比例
                double initRate = (double)initImage.Width / initImage.Height;
                //原图与模版比例相等,直接缩放
                if (templateRate == initRate)
                {
                    //按模版大小生成最终图片
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    graphics.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    graphics.Clear(Color.White);
                    graphics.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
                }
                //原图与模版比例不等,裁剪后缩放
                else
                {
                    //裁剪对象
                    System.Drawing.Image    pickedImage = null;
                    System.Drawing.Graphics pickedG     = null;

                    //定位
                    Rectangle fromR = new Rectangle(0, 0, 0, 0); //原图裁剪定位
                    Rectangle toR   = new Rectangle(0, 0, 0, 0); //目标定位

                    //宽为标准进行裁剪
                    if (templateRate > initRate)
                    {
                        //裁剪对象实例化
                        pickedImage = new System.Drawing.Bitmap(initImage.Width, (int)System.Math.Floor(initImage.Width / templateRate));
                        pickedG     = System.Drawing.Graphics.FromImage(pickedImage);

                        //裁剪源定位
                        fromR.X      = 0;
                        fromR.Y      = (int)System.Math.Floor((initImage.Height - initImage.Width / templateRate) / 2);
                        fromR.Width  = initImage.Width;
                        fromR.Height = (int)System.Math.Floor(initImage.Width / templateRate);

                        //裁剪目标定位
                        toR.X      = 0;
                        toR.Y      = 0;
                        toR.Width  = initImage.Width;
                        toR.Height = (int)System.Math.Floor(initImage.Width / templateRate);
                    }
                    //高为标准进行裁剪
                    else
                    {
                        pickedImage = new System.Drawing.Bitmap((int)System.Math.Floor(initImage.Height * templateRate), initImage.Height);
                        pickedG     = System.Drawing.Graphics.FromImage(pickedImage);

                        fromR.X      = (int)System.Math.Floor((initImage.Width - initImage.Height * templateRate) / 2);
                        fromR.Y      = 0;
                        fromR.Width  = (int)System.Math.Floor(initImage.Height * templateRate);
                        fromR.Height = initImage.Height;

                        toR.X      = 0;
                        toR.Y      = 0;
                        toR.Width  = (int)System.Math.Floor(initImage.Height * templateRate);
                        toR.Height = initImage.Height;
                    }

                    //设置质量
                    pickedG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    pickedG.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                    //裁剪
                    pickedG.DrawImage(initImage, toR, fromR, System.Drawing.GraphicsUnit.Pixel);

                    //按模版大小生成最终图片
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    graphics.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    graphics.Clear(Color.Transparent);
                    graphics.DrawImage(pickedImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, pickedImage.Width, pickedImage.Height), System.Drawing.GraphicsUnit.Pixel);

                    //释放资源
                    pickedImage.Dispose();
                    pickedG.Dispose();
                }
            }

            //return the resulting bitmap
            return(result);
        }
예제 #2
0
        /// <summary>
        /// Resize the image to the specified width and height.
        /// 图片等比缩放
        /// </summary>
        /// <param name="image">The image to resize.</param>
        /// <param name="width">The width to resize to.</param>
        /// <param name="height">The height to resize to.</param>
        /// <returns>The resized image.</returns>
        public static System.Drawing.Bitmap ZoomAutoImage(System.Drawing.Image initImage, int maxWidth, int maxHeight)
        {
            //a holder for the result
            Bitmap result = new Bitmap(maxWidth, maxHeight);

            //set the resolutions the same to avoid cropping due to resolution differences
            result.SetResolution(initImage.HorizontalResolution, initImage.VerticalResolution);

            //use a graphics object to draw the resized image into the bitmap
            using (Graphics graphics = Graphics.FromImage(result))
            {
                //模版的宽高比例
                double templateRate = (double)maxWidth / maxHeight;
                //原图片的宽高比例
                double initRate = (double)initImage.Width / initImage.Height;
                //原图与模版比例相等,直接缩放
                if (templateRate == initRate)
                {
                    //按模版大小生成最终图片
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    graphics.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    graphics.Clear(Color.White);
                    graphics.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, maxWidth, maxHeight), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
                }
                //原图与模版比例不等,裁剪后缩放
                else
                {
                    int x, y, w, h;
                    int twidth = maxWidth;
                    int height = maxHeight;
                    if (initImage.Width > twidth && initImage.Height > height)
                    {
                        w = twidth;
                        h = twidth * initImage.Height / initImage.Width;
                        if (h > height)
                        {
                            h = height;
                            w = height * initImage.Width / initImage.Height;
                            x = (twidth - w) / 2;
                            y = 0;
                        }
                        else
                        {
                            x = 0;
                            y = (height - h) / 2;
                        }
                    }
                    else if (initImage.Width > twidth)
                    {
                        w = twidth;
                        h = twidth * initImage.Height / initImage.Width;
                        x = 0;
                        y = (height - h) / 2;
                    }
                    else if (initImage.Height > height)
                    {
                        h = height;
                        w = height * initImage.Width / initImage.Height;
                        x = (twidth - w) / 2;
                        y = 0;
                    }
                    else
                    {
                        w = initImage.Width;
                        h = initImage.Height;
                        x = (twidth - w) / 2;
                        y = (height - h) / 2;
                    }

                    //按模版大小生成最终图片
                    graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    graphics.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    graphics.Clear(Color.White);
                    graphics.DrawImage(initImage, new Rectangle(x, y, w, h), 0, 0, initImage.Width, initImage.Height, GraphicsUnit.Pixel);
                }
            }
            //return the resulting bitmap
            return(result);
        }