C# C:同时调整图像大小和裁剪

C# C:同时调整图像大小和裁剪,c#,image,performance,resize,crop,C#,Image,Performance,Resize,Crop,我正在尝试写一个非常快速的方法来创建缩略图。它将同时裁剪和调整图像大小。结果图像将始终是方形的。考虑到这一点,我们现在可以看看我的代码:据我所知,它正在工作: public static void CreateAndSaveThumbnail(string path, string output, int desiredSize) { using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)

我正在尝试写一个非常快速的方法来创建缩略图。它将同时裁剪和调整图像大小。结果图像将始终是方形的。考虑到这一点,我们现在可以看看我的代码:据我所知,它正在工作:

    public static void CreateAndSaveThumbnail(string path, string output, int desiredSize)
    {
        using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
        using (Bitmap src = new Bitmap(ms))
        {
            Rectangle crop = src.Width > src.Height ?
                new Rectangle((src.Width - src.Height) / 2, 0, src.Height, src.Height) :
                new Rectangle(0, 0, src.Width, src.Width);

            int size = Math.Min(desiredSize, crop.Width);

            using (Bitmap cropped = src.Clone(crop, src.PixelFormat))
            using (Bitmap resized = new Bitmap(size, size))
            using (Graphics g = Graphics.FromImage(resized))
            {
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImage(cropped, 0, 0, size, size);
                resized.Save(output, ImageFormat.Jpeg);
            }
        }
    }
那么上面的代码是如何工作的呢?它裁剪中间部分用于风景图像,顶部用于肖像图像。所以这是一种标准行为。然后调整裁剪图像的大小,因为它已经是正方形了


这个代码行吗?能快点吗?怎样有任何可能的优化吗?

您的例程运行得很好,但有一个小问题,至少在我想要的应用程序中是这样。我想要像裁剪风景位图一样裁剪肖像位图的例程;通过从顶部裁剪一半多余部分,从位图裁剪一半多余部分。因此,我简单地将横向裁剪代码复制到纵向裁剪代码,并根据需要进行调整,结果如下:

Rectangle crop = src.Width > src.Height ?
new Rectangle((src.Width - src.Height) / 2, 0, src.Height, src.Height) :
new Rectangle(0, (src.Height - src.Width) / 2, src.Width, src.Width);

为什么需要创建克隆位图。使用带有两个矩形的DrawImage重载应该不需要创建额外的位图,我同意您不需要中间克隆的位图。此外,还不清楚为什么要将文件数据读入内存,而不仅仅是使用Image.FromFile创建原始位图对象。除此之外,您的问题并不真正适合SO,因为您有可以工作的代码,因此没有关于如何修复它的具体问题。它确实属于codereview.stackexchange.com。