.Net 4.7.2迁移后JpegBitmapEncoder/RenderTargetBitmap过度锐化问题
.Net框架升级后图片默认锐化过度问题
我正在将遗留ASP.Net/C#系统迁移至Azure,初期仅做最小改动,其中包括将.Net框架从2/3/3.5升级至4.7+。系统中有一个工具负责生成不同尺寸的图片预览,为图片添加水印、锐化并保存。近期收到客户反馈,新生成的图片锐化过度。
经过多次测试发现,即使移除额外的锐化代码(Aforge.Imaging),.Net 4.7.2生成的未锐化图片仍远比.Net 2.0版本的锐化程度高。我分别用.Net 4.7.2和2.0版本编写了极简测试程序,代码完全相同,但生成的图片差异极大。
我猜测是.Net框架内部实现发生了变更?是否可以降低这种默认的锐化程度?适度锐化是可行的,但当前程度过高。
该程序生成预览的方式较为特殊,因为在其他场景(测试程序未涉及)中需要处理元数据/色彩空间,且代码较旧,主要使用System.Windows.Media.Imaging命名空间下的类。
参数说明
- imageQuality=75
- dpi=72
- imgsize=320
核心测试代码
imageStream = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read, FileShare.Read); BitmapDecoder decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); myBitmapSource = decoder.Frames[0];
BitmapFrame myBitmapSourceFrame = (BitmapFrame)myBitmapSource; destColorContext = new ColorContext(new Uri(iccTargetProfile)); ColorContext sourceColorContext; try { sourceColorContext = myBitmapSourceFrame.ColorContexts[0]; } catch (Exception Err) {//If no inbuilt profile then default to AdobeRGB sourceColorContext = new ColorContext(new Uri(iccDefaultProfile)); ; } ColorConvertedBitmap ccb = new ColorConvertedBitmap(myBitmapSource, sourceColorContext, destColorContext, PixelFormats.Pbgra32); myBitmapSource = ccb;
double nPercent = ScalePercentage(myBitmapSource.PixelHeight, myBitmapSource.PixelWidth, imgSize, imgSize); int newHeight = Convert.ToInt16((double)myBitmapSource.PixelHeight * nPercent); int newWidth = Convert.ToInt16((double)myBitmapSource.PixelWidth * nPercent); //resize by re-drawing onto new Bitmap RenderTargetBitmap rtBitmap = new RenderTargetBitmap( newWidth /* PixelWidth */, newHeight /* PixelHeight */, imageDPI /* DpiX */, imageDPI /* DpiY */, PixelFormats.Default); DrawingVisual drawVisual = new DrawingVisual(); using (DrawingContext dc = drawVisual.RenderOpen()) { dc.DrawRectangle(new ImageBrush(myBitmapSource), null /* no pen */, new Rect(0, 0, rtBitmap.Width, rtBitmap.Height)); rtBitmap.Render(drawVisual); //WATERMARK STUFF HERE //Previous Sharpening stuff HERE List<ColorContext> colorContexts = new List<ColorContext>(); colorContexts.Add(destColorContext); //encoder JpegBitmapEncoder output = new JpegBitmapEncoder(); output.QualityLevel = imageQuality; //output.Frames.Add(BitmapFrame.Create(outFrame)); output.Frames.Add(BitmapFrame.Create(rtBitmap, null, null, new System.Collections.ObjectModel.ReadOnlyCollection<ColorContext>(colorContexts))); string endImage = folderDest + fileNameOnly; using (FileStream saveFileStream = new FileStream(endImage, FileMode.Create, FileAccess.Write)) { output.Save(saveFileStream); }
未锐化图片对比
- .Net 2.0版本生成的图片:

- .Net 4.7.2版本生成的图片:

这个问题十分棘手....
内容的提问来源于stack exchange,提问作者Daf
相关产品推荐
相关产品推荐

