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

Posted

技术标签:

【中文标题】调整图像大小时出现质量问题?【英文标题】:Quality problem when resizing image? 【发布时间】:2010-08-27 12:56:20 【问题描述】:

我正在使用此代码来调整图像大小。但结果并不好,我想要最好的质量。我知道它的质量很低,因为我也用 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 美元的专业图形软件进行比较。因此,您可能会得到不同的结果。 它的 c# 不是 javascript 函数,我知道有一种方法可以用 c# 完成 ImageResizing.Net 库将为您提供最好的质量,并正确处理the 29+ image resizing pitfalls。查看后一个链接以获取有关提高质量的提示 - 如果您想要一个免费的开源解决方案来为您处理所有边缘情况,请查看前者。 【参考方案1】:

这是我使用的例程。也许你会发现它很有用。它是一种扩展方法,用于引导。唯一的区别是我省略了保留纵横比的代码,您可以轻松插入。

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

注意事项

有关保存和加载图像的其他方法,请参阅 http://msdn.microsoft.com/en-us/library/84767bxk.aspx。

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

PNG图片

JPEG 图像

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

如果是我,我会尽快使用 PNG 格式,因为它是无损的。

【讨论】:

@berotomanya:很有趣。我一直对这个例程的质量感到满意。如果您可以发布一个与 PhotoShop 结果相比没有调整到您满意的图像示例,这将很有帮助。此外,了解您保存图像的格式会很有趣。如果您使用有损 .jpg 格式,这可能是质量问题的根源。 1.原始图像:img841.imageshack.us/img841/147/pron1.jpg 2. Photoshop 调整大小:img835.imageshack.us/img835/9956/photoshopc.jpg 3. 程序调整大小:img198.imageshack.us/img198/5216/270as.jpg 如您所见,通过 Photoshop 调整大小的图像大小为 17kb,另一方面,程序调整大小为 4kb。并且确保质量明显很差(尤其是当您的客户是新娘房时)。 @berotomanya:Imageshack 在我的工作中被阻止。我回家后看看。同时,更改您的保存代码,使其使用ImageFormat.Png。这将防止您因 .JPG 图像格式而丢失。 如何更改我的代码以使用 ImageFormat.Png?还有没有办法用现有的格式解决这个问题? @berotomanya:在检查了您的示例图片后,我在答案中添加了更多内容。我想你会找到完整的答案。

以上是关于调整图像大小时出现质量问题?的主要内容,如果未能解决你的问题,请参考以下文章

调整大小时 SVG 图像质量下降

在 PictureBox Form C# 中调整大小时丢失图像质量

HTML 5 Canvas] 调整大小时的图像质量

如何在 iPhone 中以高质量调整图像大小

浏览器图像调整大小,优于最高 PIL 质量

在不损失任何质量的情况下调整图像大小[关闭]