日期:2014-05-19  浏览次数:20424 次

.net 图片缩放质量问题
我要做一个程序来把本来很大尺寸的图片生成宽限定在750,高为同比例缩放的图片。

但是我发觉,图片的质量不是很高(应该说已经很高了,可是领导不认为,我用photoshop生成同样大小的图片的确质量比我的高,要仔细观察图片细节才看的出来),我想问得是,.net   下有没有更高质量的方法,或者有没有其他组件可以使用?

http://adow.thmz.com/pk/default.html   这里有一批图片,分别是我通过程序和ps制作的同样尺寸的图片(上一张是ps生成的,下一张是.net   生成的),如果观察一些细节(比如字),的确能看出有少许不同。

我用了如下的属性设置,我感觉已经是.net下最好的质量了:
Bitmap   img   =   new   Bitmap(object_width,   object_height);
                        img.SetResolution(72f,   72f);
Graphics   gdiobj   =   Graphics.FromImage(img);
gdiobj.CompositingQuality   =   CompositingQuality.HighQuality;
gdiobj.SmoothingMode   =   SmoothingMode.HighQuality;
gdiobj.InterpolationMode   =   InterpolationMode.HighQualityBicubic;



------解决方案--------------------
试试这个,我觉得质量可以

public static void GenerateHighThumbnail( string oldImagePath, string oldFileName, int width, int height )
{
System.Drawing.Image oldImage = System.Drawing.Image.FromFile(oldImagePath + oldFileName);
int newWidth, imgWidth;
int newHeight, imgHeight;

//。。。。。。。。。。。

System.Drawing.Image thumbnailImage = oldImage.GetThumbnailImage(newWidth, newHeight, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
System.Drawing.Bitmap bm = new System.Drawing.Bitmap(thumbnailImage);


//处理JPG质量的函数
System.Drawing.Imaging.ImageCodecInfo ici = GetEncoderInfo( "image/jpeg ");
if (ici != null)
{
System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters(1);
ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(Encoder.Quality, (long)100);
bm.Save(oldImagePath + "s " + oldFileName, ici, ep);

//释放所有资源,不释放,可能会出错误。
ep.Dispose();
ep = null;
}
ici = null;

bm.Dispose();
bm = null;

thumbnailImage.Dispose();
thumbnailImage = null;
oldImage.Dispose();
oldImage = null;
}

private static bool ThumbnailCallback( )
{
return false;
}
private static ImageCodecInfo GetEncoderInfo( String mimeType )
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0 ; j < encoders.Length ; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

------解决方案--------------------
www.wave12.com有个缩略图水印组件wsImage3.5  效果很好