调整图像大小时出现质量问题?

4

我正在使用这段代码来调整图像大小。但结果不是很好,我想要最佳质量。我知道质量较差是因为我用Photoshop对同一张图片进行了缩放,结果却更好。我该如何解决这个问题呢?

private static Image resizeImage(Image imgToResize, Size size)
    {
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)size.Width / (float)sourceWidth);
        nPercentH = ((float)size.Height / (float)sourceHeight);

        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();

        return (Image)b;
    }

我知道这只是调整大小,但这很值得说一下,你正在将一个JavaScript函数与价值1000美元的专业图形软件进行比较。因此,可能会得到不同的结果。 - Iznogood
这不是JavaScript函数,而是C#函数。我知道有一种用C#实现它的方法。 - beratuslu
ImageResizing.Net 库将为您提供最佳质量,并正确处理 29+个图像调整陷阱。请查看后面的链接以获取有关如何改善质量的提示 - 如果您想要一个免费的开源解决方案,可以处理所有边缘情况,请查看前者。 - Lilith River
1个回答

3

这是我使用的常规方法。也许你会发现它很有用。它是一个扩展方法。唯一的区别是我省略了保留纵横比的代码,你可以很容易地插入。

public static Image GetImageHiQualityResized(this Image image, int width, int height)
{
    var thumb = new Bitmap(width, height);
    using (var g = Graphics.FromImage(thumb))
    {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.InterpolationMode = InterpolationMode.High;
        g.DrawImage(image, new Rectangle(0, 0, thumb.Width, thumb.Height));
        return thumb;
    }
}

这个扩展方法的使用示例包括:

// Load the original image
using(var original = Image.FromFile(@"C:\myimage.jpg"))
using(var thumb = image.GetImageHiQualityResized(120, 80))
{
    thumb.Save(@"C:\mythumb.png", ImageFormat.Png);
}

备注

默认的JPG编码和默认的PNG编码之间的区别确实非常不同。下面是使用您示例的两个缩略图,一个使用ImageFormat.Png保存,另一个使用ImageFormat.Jpeg保存。

PNG图片

PNG Image

JPEG图片

JPEG Image

如果您确定必须使用JPEG,则可能会发现此问题中原始帖子的工作对您有所帮助。它涉及将图像编解码器和编码参数配置为高质量设置。.NET Saving jpeg with the same quality as it was loaded

如果我是您,我会选择使用PNG格式,因为它是无损的。


@berotomanya:有趣。我一直对这个例程的质量感到满意。如果您能发布一个未能满足您期望的图像示例,并与PhotoShop结果进行比较,那将非常有帮助。此外,了解您保存图像的格式也很有趣。如果您使用有损的.jpg格式,那可能是质量问题的根源。 - kbrimington
  1. 原始图片:http://img841.imageshack.us/img841/147/pron1.jpg
  2. Photoshop 调整大小后:http://img835.imageshack.us/img835/9956/photoshopc.jpg
  3. 编程调整大小后:http://img198.imageshack.us/img198/5216/270as.jpg
正如您所见,Photoshop 调整大小后的图像大小为17kb,而编程调整大小的图像大小为4kb。而且显然质量较差(尤其是当你的客户是一个婚纱店时)。
- beratuslu
@berotomanya:我的工作地方屏蔽了Imageshack。我回家后会看一下。与此同时,请更改您的保存代码,以便使用“ImageFormat.Png”代替。这将防止由于.JPG图像格式而导致的数据丢失。 - kbrimington
如何更改我的代码以使用ImageFormat.Png?难道没有任何方法可以通过现有格式解决这个问题吗? - beratuslu
@berotomanya:在检查了你的示例图片后,我又添加了更多内容到答案里。我认为你会觉得这个答案很全面。 - kbrimington
非常感谢你!但我觉得我需要再多找一些关于这个主题的资料。 - beratuslu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接