You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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 2.0生成的图片
  • .Net 4.7.2版本生成的图片:
    .Net 4.7.2生成的图片

这个问题十分棘手....

内容的提问来源于stack exchange,提问作者Daf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:20:35