减少大图像尺寸的最安全方法

时间:2011-10-16 20:55:28

标签: c# image-processing

我在这里和其他网站上花了很多时间试图找到重新取样图像的好方法。下面的代码是我正在使用的代码

public static Bitmap ResampleImage(Image img, Size size, long quality) {
        try {
            var bmp = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppPArgb);
            using (var gr = Graphics.FromImage(bmp)) {
                gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                gr.DrawImage(img, new Rectangle(Point.Empty, size));
            }

            return setImageQualityLevel(bmp, quality);
        }
        catch (Exception ex) {
            logger.Warn(string.Format("Image Resample Failed:\r\n{0}\r\n{1}", ex.Message, ex.StackTrace));
                return (Bitmap)img;
        }
    }

不幸的是,它经常无法触发catch块。大多数情况下这是大图像(高达20Mb) - 这些尺寸在我的应用程序中没有任何好处,但我不想对我的用户说 - 在尝试使用之前将其减少到1Mb。我也在使用以下内容加载图像时出现OOM失败:

image2Use = new Bitmap(image.Filename);

因此,即使在我将其转换为我的重新采样代码之前,它仍然失败。

所以我真正想要的是获得图像并重新调整大小的一些安全方法。我宁愿不去使用第三方库的开销,因为这就是我想做的事情 - 加载一个大的图像文件并使它变得更小!

2 个答案:

答案 0 :(得分:0)

请考虑使用第三方。

ImageMagick has a C# interface

他们有一个很好的convert命令行实用程序,可以完全按照您的意愿执行。

我已经使用它们已经好几年了,并且它们在不同环境(Windows桌面一直到* nix服务器)的易用性和功能方面给我留下了非常深刻的印象。

答案 1 :(得分:0)

因为它只发生在大图像上...... 假设您的流程在图片上传后立即启动......

在您的流程开始处理之前,图像可能尚未完成复制。

要验证,请手动复制其中一张大图像。然后,开始你的过程。如果它有效,你就会知道你的过程是正常的。