调整图像大小时出现质量问题?
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:在检查了您的示例图片后,我在答案中添加了更多内容。我想你会找到完整的答案。以上是关于调整图像大小时出现质量问题?的主要内容,如果未能解决你的问题,请参考以下文章