从中心C#裁剪图像 [英] C# crop image from center

查看:160
本文介绍了从中心C#裁剪图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开发的应用程序使用.NET(4.5)MVC(4.0)C#(5.0)。 我要生成的图像,我已经有图像的缩略图。 现在的要求是像它应该生成图像的中心广场最大部分的缩略图不拉伸不整幅图像,除非图像是方形的大小。

按例如我原来的图像尺寸:578x700 我要生成缩略图占位尺寸:200x150,185x138,140x140,89x66,80×80,45X45,28x28

我有我的创造跌破code,但没有得到确切的结果。 这里要说的是生成缩略图我的核心方法

 公共字符串GenerateThumbnailFromImage(字符串imageFilePath,诠释thumbWidth,INT thumbHeight)
    {
        尝试
        {
            //检查文件是否存在
            如果(File.Exists(imageFilePath))
            {
                //布尔preserveAspectRatio = TRUE;
                字符串oldFilePath = imageFilePath;
                字符串FOLDERPATH = Path.GetDirectoryName(imageFilePath);
                字符串文件名= Path.GetFileNameWithoutExtension(imageFilePath);

                //重命名文件缩略图大小
                文件名=文件名+_+ thumbWidth.ToString()+ Path.GetExtension(imageFilePath);
                imageFilePath = Path.Combine(FOLDERPATH,文件名);


                使用(形象画像= Image.FromFile(oldFilePath))
                {
                    十进制originalWidth = image.Width;
                    十进制originalHeight = image.Height;
                    十进制requiredThumbWidth = thumbWidth;
                    十进制requiredThumbHeight = thumbHeight;
                    小数startXPosition = 0;
                    小数startYPosition = 0;
                    十进制屏幕宽度= originalWidth;
                    十进制screenHeight = originalHeight;
                    十进制AR = thumbWidth< thumbHeight
                                     ? originalWidth / originalHeight
                                     :originalHeight / originalWidth;

                    //定义开始为缩略图生成位置
                    如果(originalWidth> originalHeight)
                        startXPosition =(originalWidth  -  originalHeight)/ 2;
                    否则,如果(originalHeight> originalWidth)
                        startYPosition =(originalHeight  -  originalWidth)/ 2;

                    如果(thumbWidth> thumbHeight)
                    {
                        requiredThumbWidth = thumbWidth;
                        requiredThumbHeight = requiredThumbWidth * AR;
                    }
                    否则,如果(thumbHeight> thumbWidth)
                    {
                        requiredThumbHeight = thumbHeight;
                        requiredThumbWidth = requiredThumbHeight * AR;
                    }
                    其他
                    {
                        requiredThumbWidth = thumbWidth;
                        requiredThumbHeight = thumbWidth;
                    }

                    使用(VAR BMP =新位图((INT)requiredThumbWidth,(INT)requiredThumbHeight))
                    {
                        图形GR = Graphics.FromImage(BMP);
                        gr.Smoothi​​ngMode = Smoothi​​ngMode.HighQuality;
                        gr.CompositingQuality = CompositingQuality.HighQuality;
                        gr.InterpolationMode = InterpolationMode.High;
                        变种rectDestination =新矩形(0,0,(int)的requiredThumbWidth,(int)的requiredThumbHeight);

                        gr.DrawImage(图像,rectDestination,(INT)startXPosition,(INT)startYPosition,(INT)屏幕宽度,(INT)screenHeight,GraphicsUnit.Pixel);
                        bmp.Save(imageFilePath);

                        返回的文件名;
                    }
                }
            }
            返回null;
        }
        赶上(例外前)
        {
            GlobalUtil.HandleAndLogException(恩,这一点);
            抛出前;
        }
        最后
        {

        }
    }
 

解决方案

您需要获得对实际大小的目标大小的比例。短边缩放,直到它触及实际的影像尺寸。裁剪从中心开始并进行缩放到期望的大小。

下面是code:



 公共静态图像ResizeImage(图片imgToResize,大小destinationSize)
        {
            VAR originalWidth = imgToResize.Width;
            VAR originalHeight = imgToResize.Height;

            //多少个单位的作用就是使原来的长度
            VAR hRatio =(浮点)originalHeight / destinationSize.Height;
            VAR wRatio =(浮点)originalWidth / destinationSize.Width;

            //获取短边
            VAR比率= Math.Min(hRatio,wRatio);

            变种HSCALE = Convert.ToInt32(destinationSize.Height *比);
            变种wScale = Convert.ToInt32(destinationSize.Width *比);

            //开始从中心裁剪
            VAR STARTX =(originalWidth  -  wScale)/ 2;
            变种startY =(originalHeight  -  HSCALE)/ 2;

            //从指定的位置和大小裁剪图像
            VAR sourceRectangle =新的Rectangle(STARTX,startY,wScale,HSCALE);

            //图像的未来规模
            VAR位图=新位图(destinationSize.Width,destinationSize.Height);

            //填充在整个位图
            VAR destinationRectangle =新的Rectangle(0,0,bitmap.Width,bitmap.Height);

            //生成新形象
            使用(VAR G = Graphics.FromImage(位图))
            {
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(imgToResize,destinationRectangle,sourceRectangle,GraphicsUnit.Pixel);
            }

            返回的位图;

        }


这样称呼它:


VAR thumbImage = ImageHelper.ResizeImage(形象,新的大小(45,45));
thumbImage.Save(thumbFullPath);

I am developing application using .NET(4.5) MVC(4.0) C#(5.0). i want to generate image thumbnail from image that i already have. Now requirement is like it should generate thumbnail of maximum square portion from center of image without stretching not whole image except image is square size.

as per example my original image size :578x700 i want to generate thumbnail for placeholder size :200x150, 185x138, 140x140, 89x66, 80x80, 45x45, 28x28

i had create my below code but didn't get exact result. here is my core method that generate thumbnail

    public string GenerateThumbnailFromImage(string imageFilePath, int thumbWidth, int thumbHeight)
    {
        try
        {
            //Check if file exist
            if (File.Exists(imageFilePath))
            {
                //bool preserveAspectRatio = true;
                string oldFilePath = imageFilePath;
                string folderPath = Path.GetDirectoryName(imageFilePath);
                string filename = Path.GetFileNameWithoutExtension(imageFilePath);

                //Rename file with thumbnail size
                filename = filename + "_" + thumbWidth.ToString() + Path.GetExtension(imageFilePath);
                imageFilePath = Path.Combine(folderPath, filename);


                using (Image image = Image.FromFile(oldFilePath))
                {
                    decimal originalWidth = image.Width;
                    decimal originalHeight = image.Height;
                    decimal requiredThumbWidth = thumbWidth;
                    decimal requiredThumbHeight = thumbHeight;
                    decimal startXPosition = 0;
                    decimal startYPosition = 0;
                    decimal screenWidth = originalWidth;
                    decimal screenHeight = originalHeight;
                    decimal ar = thumbWidth < thumbHeight 
                                     ? originalWidth / originalHeight
                                     : originalHeight / originalWidth;

                    //Define Starting Position for thumbnail generation
                    if (originalWidth > originalHeight)
                        startXPosition = (originalWidth - originalHeight) / 2;
                    else if (originalHeight > originalWidth)
                        startYPosition = (originalHeight - originalWidth) / 2;

                    if (thumbWidth>thumbHeight)
                    {
                        requiredThumbWidth = thumbWidth;
                        requiredThumbHeight = requiredThumbWidth*ar;
                    }
                    else if (thumbHeight>thumbWidth)
                    {
                        requiredThumbHeight = thumbHeight;
                        requiredThumbWidth = requiredThumbHeight*ar;
                    }
                    else
                    {
                        requiredThumbWidth = thumbWidth;
                        requiredThumbHeight = thumbWidth;
                    }

                    using (var bmp = new Bitmap((int)requiredThumbWidth, (int)requiredThumbHeight))
                    {
                        Graphics gr = Graphics.FromImage(bmp);
                        gr.SmoothingMode = SmoothingMode.HighQuality;
                        gr.CompositingQuality = CompositingQuality.HighQuality;
                        gr.InterpolationMode = InterpolationMode.High;
                        var rectDestination = new Rectangle(0, 0, (int)requiredThumbWidth, (int)requiredThumbHeight);

                        gr.DrawImage(image, rectDestination, (int)startXPosition, (int)startYPosition, (int)screenWidth, (int)screenHeight, GraphicsUnit.Pixel);
                        bmp.Save(imageFilePath);

                        return filename;
                    }
                }
            }
            return null;
        }
        catch (Exception ex)
        {
            GlobalUtil.HandleAndLogException(ex, this);
            throw ex;
        }
        finally
        {

        }
    }

解决方案

You need to get the ratio of the destination size against the actual size. Scale the shorter side until it touches the actual image size. Crop it starting from the center and scale it to the desired size.

Here is the code:



 public static Image ResizeImage(Image imgToResize, Size destinationSize)
        {
            var originalWidth = imgToResize.Width;
            var originalHeight = imgToResize.Height;

            //how many units are there to make the original length
            var hRatio = (float)originalHeight/destinationSize.Height;
            var wRatio = (float)originalWidth/destinationSize.Width;

            //get the shorter side
            var ratio = Math.Min(hRatio, wRatio);

            var hScale = Convert.ToInt32(destinationSize.Height * ratio);
            var wScale = Convert.ToInt32(destinationSize.Width * ratio);

            //start cropping from the center
            var startX = (originalWidth - wScale)/2;
            var startY = (originalHeight - hScale)/2;

            //crop the image from the specified location and size
            var sourceRectangle = new Rectangle(startX, startY, wScale, hScale);

            //the future size of the image
            var bitmap = new Bitmap(destinationSize.Width, destinationSize.Height);

            //fill-in the whole bitmap
            var destinationRectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

            //generate the new image
            using (var g = Graphics.FromImage(bitmap))
            {
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(imgToResize, destinationRectangle, sourceRectangle, GraphicsUnit.Pixel);
            }

            return bitmap;

        }


Call it like this:


var thumbImage = ImageHelper.ResizeImage(image, new Size(45, 45));
thumbImage.Save(thumbFullPath);

这篇关于从中心C#裁剪图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆