我使用此代码创建缩略图
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();
但是我得到了这个非常低质量的图像
但它可以像这样
我错了 或者如何实现这个
答案 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;
}