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

Posted

技术标签:

【中文标题】C#:同时调整图像大小和裁剪【英文标题】:C#: Image resize and crop at the same time 【发布时间】:2015-03-06 00:05:46 【问题描述】:

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

    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);
            
        
    

那么上面的代码是如何工作的呢?它为横向图像裁剪中间部分,为纵向图像裁剪顶部。所以这是一种标准行为。然后它调整裁剪图像的大小(它已经是一个正方形)。

这段代码可以吗?可以更快吗?如何?可以进行任何优化吗?

【问题讨论】:

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

您的例程效果很好,但对于一个小问题,至少在我想要的应用程序中是这样。我希望例程像裁剪横向位图一样裁剪纵向位图;通过从位图中裁剪掉顶部多余的一半和多余的一半。所以我只是将横向裁剪代码复制到纵向裁剪代码并根据需要进行调整,结果如下:

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);

【讨论】:

以上是关于C#:同时调整图像大小和裁剪的主要内容,如果未能解决你的问题,请参考以下文章

C# 裁剪和调整大图像大小

调整图像大小并裁剪为新的纵横比

使用 PHP 图像调整大小/裁剪内置方法的高内存使用率

第一次调整大小时无法裁剪图像

如何在以下代码中停止调整大小和裁剪?

图像调整大小和裁剪