先把问题说一下再贴代码,我要实现一个按比例生成缩略图的方法,也实现了,但是在生成的缩略图中,有部分生成出来是正常的,但是有部分生成出来的质量相当差,很模糊,虽然也是按比例生成的,我也将生成的图片长宽都手动计算并与原图核对了一下。。比例完全正常,但图像质量真的很差,请大家帮我看下这段代码有什么问题,谢谢了!
我用来测试的原图分辨率是2592*1456
代码如下:
private static bool BuildThumbnail(string sourceFile, string destFile, int width, int height) { System.Drawing.Image.GetThumbnailImageAbort myCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallBack);//提供一个回调方法,用于决定获取缩略图的方法在何时提前取消执行。 Bitmap bmp = new Bitmap(sourceFile); try { if (bmp.Width > bmp.Height)//计算等比例缩放的宽高,原图中2者中较大的值来计算 { height = bmp.Height * width / bmp.Width; } else { width = bmp.Width * height / bmp.Height; } System.Drawing.Image thumbnail = bmp.GetThumbnailImage(width, height, myCallBack, IntPtr.Zero);//检索图片中是否包含缩略图,如果不包含,就按比例缩放来生成一个缩略图。 string destPath = Path.GetFullPath(destFile); if (!Directory.Exists(destPath)) { Directory.CreateDirectory(destPath); } thumbnail.Save(destFile);//将图像保存到指定path中。 return true; } catch (Exception ex) { Utility.Logger.Error("生成缩略图时错误:" + ex.Message); return false; } finally { bmp.Dispose(); } } private static bool ThumbnailCallBack()//CreateThumbnail方法需要调用这个方法。 { return false; }
我想会不会是整除的问题?计算缩放的地方。由于你用的是取整,可能导致宽高比没有达到你所需要的等比。
取整影响不会太大,计算出来的结果差就在0.几px,不到1,
bmp.GetThumbnailImage(width, height, myCallBack, IntPtr.Zero);
这个方法是.net自带的,所以不知道是哪的问题。。
@hexllo: 你的缩略图那么小?取整居然只有那么点差距?贴缩略图尺寸吧。
@幻天芒:
原图像素是:2592X1456
缩略图像素是:770X433
2592/1456=1.780
770/433=1.778
它们的长宽比只相差很少(1.780-1.778=0.002),不应该变模糊啊。。
@hexllo: 搜到一个方案,你看看:http://blog.sina.com.cn/s/blog_6154bf970100ot9r.html
我是新手都知道,这段代码,跟生成缩略图一点关系都没有!缩略图生成应该在是GetThumbnailImage()里面
bmp.GetThumbnailImage(width, height, myCallBack, IntPtr.Zero);
这个方法是.net自带的,所以不知道是哪的问题。。
对于客户提出的不可验证的问题,或者信息量不足的,主观感觉太强烈的,我们处理的优先级都相当低。
类似你这种问题,你需要提供的是大图、小图,大图的尺寸(长和宽),小图的尺寸(长和宽)
提供一个你认为显示正常的图,一个你认为显示不正常的图。
这种信息比你的代码有用多了。
因为初学者通常的问题都是栽在这上面。
哥们,发现你在回答问题前通常会写几句比较逗比,但又有道理的话。。。
我放个异常的图上来,请帮我看一下是怎么回事,图片得下下来才能测试,谢谢了