请帮我image.GetThumbnailImage(它创建非常低质量的图像)

时间:2010-10-19 19:20:51

标签: asp.net image thumbnails system.drawing

我使用此代码创建缩略图

System.Drawing.Image.GetThumbnailImageAbort abort = new System.Drawing.Image.GetThumbnailImageAbort(this.ThumbnailCallback);
System.Drawing.Image image2 = image.GetThumbnailImage((int)Math.Round((double)wid / difference), (int)Math.Round((double)hei / difference), abort, IntPtr.Zero);
image2.Save(str2, System.Drawing.Imaging.ImageFormat.Jpeg);
image2.Dispose();

但是我得到了这个非常低质量的图像

alt text

但它可以像这样

alt text

我错了 或者如何实现这个

2 个答案:

答案 0 :(得分:2)

问题不在于GetThumbnailImage()方法,而在于如何保存文件。您需要指定要保存的JPEG的质量级别,或者它似乎总是默认为非常低的值。

将此代码视为指南(它来自旧的.NET 2.0项目;代码仍然可以在4.0版本中正常编译,但在4.0中可能有更直接的方法;我从来没有理由检查)

ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpegEncoder = null;
for (int x = 0; x < encoders.Length; x++) {
    if (string.Compare(encoders[x].MimeType, "image/jpeg", true) == 0) {
        jpegEncoder = encoders[x];
        break;
    }
}
if (jpegEncoder == null) throw new ApplicationException("Could not find JPEG encoder!");
EncoderParameters prms = new EncoderParameters(1);
prms.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
bitmap.Save(fileName, jpegEncoder, prms);

答案 1 :(得分:1)

这是另一个解决方案,应始终有效,而无需取出编码器。调整大小以保持宽度与高度之间的关系...根据您的需要进行修改。

/// <summary>
/// Resize an image with high quality
/// </summary>
public static Image ResizeImage(Image srcImage, int width)
{
    var b = new Bitmap(width, srcImage.Height * width / srcImage.Width);
    using (var g = Graphics.FromImage((Image)b))
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(srcImage, 0, 0, b.Width, b.Height);
    }
    return b;
}