帮助图像大小调整方法gdi

时间:2011-05-17 12:41:55

标签: c# image-processing gdi

所以我需要一些调整大小。

我发现了两种不同的方法。

一个看起来像这样:

public static Byte[] ResizeImageNew(System.Drawing.Image imageFile, int targetWidth, int targetHeight) {
        using(imageFile){
            Size newSize = CalculateDimensions(imageFile.Size, targetWidth, targetHeight);

            using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)) {
                newImage.SetResolution(imageFile.HorizontalResolution, imageFile.VerticalResolution);
                using (Graphics canvas = Graphics.FromImage(newImage)) {
                    canvas.SmoothingMode = SmoothingMode.AntiAlias;
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    canvas.DrawImage(imageFile, new Rectangle(new Point(0, 0), newSize));
                    MemoryStream m = new MemoryStream();
                    newImage.Save(m, ImageFormat.Jpeg);
                    return m.GetBuffer();
                }
            }
        }
    }

另一个:

    public static System.Drawing.Image ResizeImage(System.Drawing.Image originalImage, int width, int maxHeight) {
        originalImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        originalImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        int NewHeight = originalImage.Height * width / originalImage.Width;
        if (NewHeight > maxHeight) {
            // Resize with height instead
            width = originalImage.Width * maxHeight / originalImage.Height;
            NewHeight = maxHeight;
        }

        System.Drawing.Image newImage = originalImage.GetThumbnailImage(width, NewHeight, null, IntPtr.Zero);

        return newImage;
    }

我基本上'借用'这两种方法,只是改变了点点滴滴。

然而 - 使用第一个,每当我调整到更小的图片时,文件的大小实际上大于原始(!?)

第二个虽然大大改善了尺寸看起来很可怕:/

我当然只是在第一种方法中仅仅提高图像质量,如果可能的话,但是从我的角度来看,我看不出怎样,一切看起来都是“高质量”?

2 个答案:

答案 0 :(得分:1)

您可能必须设置JPEG压缩级别。目前,它可能会保存在非常高的质量水平,这可能不是您想要的。

有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/bb882583.aspx

但请注意,仅降低图像的分辨率并不一定会减少文件大小。由于压缩的工作原理,由于插值模式而模糊的较小分辨率文件可能比原始模块大得多,但由于有损算法,JPEG可能不是一个大问题。但是,如果原始文件之前非常简单(如“平面”webcomic或简单的矢量图形),并且在调整大小后模糊不清,它可以为PNG带来巨大的差异。

答案 1 :(得分:1)

无论文件大小问题如何,我肯定会建议使用第一种方法,而不是使用GetThumbnailImage的方法。

GetThumbnailImage实际上会从源图像中提取嵌入的缩略图(如果存在)。不幸的是,这意味着如果您没有预料到并考虑到嵌入式缩略图,那么您将从一些未知的原始文件大小和质量(与原始文件相比)进行扩展。这也意味着您将在一次运行(使用嵌入式缩略图)上获得与在另一次运行(没有嵌入式缩略图)时相同的质量结果。

我已经多次使用类似于你的第一种方法的东西,虽然我偶尔看到你看到的东西,结果却一直都好一些。

相关问题