WPF RichTextBox经装饰器调整大小后保存图片逐次模糊问题求解
问题根本原因
你遇到的模糊叠加问题核心是每次保存都没有使用原始图片数据源,而是导出了RichTextBox中当前经过缩放渲染的位图:
- 用ResizingAdorner调整的只是Image控件的
Width/Height渲染尺寸,没有修改原始图像的像素数据源 - 当前的导出逻辑是直接抓取RichTextBox里Image控件渲染后的可视化对象生成PNG,相当于每次都对上一次已经缩放采样的低清图片再次重采样,所以每次保存模糊程度都会叠加
解决步骤
1. 给插入的Image控件附加原始数据源依赖属性
首先自定义一个附加属性,保存图片插入时的原始BitmapSource,避免后续修改控件尺寸丢失原始数据:
public static class ImageAttachProperty { public static readonly DependencyProperty OriginalSourceProperty = DependencyProperty.RegisterAttached( "OriginalSource", typeof(BitmapSource), typeof(ImageAttachProperty), new PropertyMetadata(default(BitmapSource))); public static void SetOriginalSource(UIElement element, BitmapSource value) { element.SetValue(OriginalSourceProperty, value); } public static BitmapSource GetOriginalSource(UIElement element) { return (BitmapSource)element.GetValue(OriginalSourceProperty); } }
图片插入(包括粘贴、拖拽插入)的时候,除了给Image控件的Source赋值,同时给附加属性ImageAttachProperty.OriginalSource赋值为原始的位图对象。
2. 调整ResizingAdorner逻辑,仅修改Image的渲染尺寸
ResizingAdorner拖拽调整的时候,只修改Image控件的Width、Height属性,不要对Image的Source做任何缩放、重采样操作,保留原始Source不变。
3. 保存图片时用原始数据源做缩放
导出PNG的时候,不要直接抓取Image控件的渲染结果,而是读取附加属性里存的原始BitmapSource,按照当前Image控件的宽高做高清重采样:
public BitmapSource ResizeImage(BitmapSource original, double targetWidth, double targetHeight) { // 用最高质量重采样模式 var scaleX = targetWidth / original.PixelWidth; var scaleY = targetHeight / original.PixelHeight; var scaleTransform = new ScaleTransform(scaleX, scaleY, 0, 0) { BitmapScalingMode = BitmapScalingMode.HighQuality }; var transformedBitmap = new TransformedBitmap(original, scaleTransform); transformedBitmap.Freeze(); return transformedBitmap; }
导出的时候调用这个方法,传入原始数据源和当前Image控件的宽高,再把返回的高清重采样结果保存为PNG。
4. 优化XAML存储逻辑
保存RichTextBox的XAML内容时,不要把渲染后的位图固化到Image的Source属性里,只保存Image的Width、Height属性,以及对应独立存储的PNG文件的关联标识。下次加载XAML的时候直接读取对应原始PNG文件赋值给附加属性,再设置对应的渲染尺寸即可。
额外注意点
- 导出PNG时使用无损配置:
PngBitmapEncoder的Interlace设为PngInterlaceOption.Off,BitmapCreateOptions设为PreservePixelFormat - 如果插入的是矢量图,直接保存原始矢量数据源,导出时按尺寸渲染即可彻底避免模糊问题
内容的提问来源于stack exchange,提问作者user13898537
相关产品推荐
相关产品推荐

