C# 关闭从画布渲染的黑白位图的抗锯齿

C# 关闭从画布渲染的黑白位图的抗锯齿,c#,wpf,bitmap,antialiasing,C#,Wpf,Bitmap,Antialiasing,我对WPF的文本抗锯齿有问题。在我的应用程序中,用户设计要使用特殊打印设备打印的文本或图像字段。我使用画布来承载字段,这些字段可以是文本块,也可以是图像 问题是,当我将此画布转换为RenderTargetBitmap,然后转换为黑白格式ConvertedBitmap时,文本和图像最终看起来非常模糊 我尝试在应用程序中的所有内容上使用“snaptodevicepixels=true”和“RenderOptions.EdgeMode”=别名。我知道消除混叠对屏幕很有好处,但打印是一场真正的灾难 下面

我对WPF的文本抗锯齿有问题。在我的应用程序中,用户设计要使用特殊打印设备打印的文本或图像字段。我使用画布来承载字段,这些字段可以是文本块,也可以是图像

问题是,当我将此画布转换为RenderTargetBitmap,然后转换为黑白格式ConvertedBitmap时,文本和图像最终看起来非常模糊

我尝试在应用程序中的所有内容上使用“snaptodevicepixels=true”和“RenderOptions.EdgeMode”=别名。我知道消除混叠对屏幕很有好处,但打印是一场真正的灾难

下面是我的代码示例:

private BitmapSource GetCanvasAsBitmap(Canvas cvs)
  {   
   cvs.Background = Brushes.White;
   RenderOptions.SetEdgeMode(cvs, EdgeMode.Aliased);
   cvs.SnapsToDevicePixels = true;

   // render TopCanvas visual tree to the RenderTargetBitmap

   Size CanvasSize = new Size(cvs.Width, cvs.Height);
   cvs.Measure(CanvasSize);
   Rect CanvasRect = new Rect(CanvasSize);
   cvs.Arrange(CanvasRect);

   RenderTargetBitmap targetBitmap =
    new RenderTargetBitmap((int)cvs.ActualWidth,
     (int)cvs.ActualHeight,
     96, 96,
     PixelFormats.Default);

   targetBitmap.Render(cvs);


   double scale = PIXELSCALE / cvs.Height;
   ScaleTransform ST = new ScaleTransform(scale, scale);

   TransformedBitmap TB = new TransformedBitmap(targetBitmap, ST);

   return TB;
  }



  private static FormatConvertedBitmap Recolor(BitmapSource b)
  {   
   BmpBitmapEncoder encoder = new BmpBitmapEncoder();
   encoder.Frames.Add(BitmapFrame.Create(b));

   using (FileStream fs = new FileStream("BeforeRecolor.bmp", FileMode.Create))
   {
    encoder.Save(fs);    
    fs.Flush();
    fs.Close();
   }

   FormatConvertedBitmap FCB = new FormatConvertedBitmap(b, PixelFormats.Indexed1, new BitmapPalette(new List<Color>() { Colors.Black, Colors.White }), 0);

   BmpBitmapEncoder en = new BmpBitmapEncoder();
   en.Frames.Add(BitmapFrame.Create(FCB));

   using (FileStream fs = new FileStream("AfterRecolor.bmp", FileMode.Create))
   {
    en.Save(fs);
    fs.Flush();
    fs.Close();
   }

   return FCB;
  }
私有位图源GetCanvasAsBitmap(画布cvs)
{   
cvs.Background=画笔.白色;
SetEdgeMode(cvs,EdgeMode.Aliased);
cvs.SnapsToDevicePixels=真;
//将TopCanvas视觉树渲染到RenderTargetBitmap
尺寸画布尺寸=新尺寸(CV.Width,cvs.Height);
cvs.测量(画布尺寸);
Rect CanvasRect=新的Rect(CanvasSize);
简历安排(CanvasRect);
RenderTargetBitmap目标位图=
新的RenderTargetBitmap((int)cvs.ActualWidth,
(int)cvs.实际高度,
96, 96,
像素格式(默认);
targetBitmap.Render(cvs);
双比例=像素比例/CV高度;
ScaleTransform ST=新的ScaleTransform(缩放,缩放);
TransformedBitmap TB=新的TransformedBitmap(targetBitmap,ST);
返回结核病;
}
专用静态格式ConvertedBitmap Recor(位图源b)
{   
BmpBitmapEncoder编码器=新的BmpBitmapEncoder();
Add(BitmapFrame.Create(b));
使用(FileStream fs=newfilestream(“beforereclor.bmp”,FileMode.Create))
{
编码器保存(fs);
fs.Flush();
fs.Close();
}
FormatConvertedBitmap FCB=新FormatConvertedBitmap(b,PixelFormats.Indexed1,新位图调色板(新列表(){Colors.Black,Colors.White}),0);
BmpBitmapEncoder en=新的BmpBitmapEncoder();
en.Frames.Add(BitmapFrame.Create(FCB));
使用(FileStream fs=newfilestream(“AfterRecolor.bmp”,FileMode.Create))
{
en.Save(fs);
fs.Flush();
fs.Close();
}
返回FCB;
}
在创建rendertargetbitmap之前,如何关闭防锯齿功能?

显然抖动类型是硬编码的

格式转换位图 此类包装标准WIC像素格式 转换器(IwicMagingFactory::CreateFormatConverter)。此组件 提供从一种像素格式转换为另一种像素格式的方法, 处理索引格式的抖动和半色调,调色板 平移和alpha阈值。源、目标格式、, DestinationPalette和AlphaThreshold属性用于 通过初始化基础组件 IWICFormatConverter::初始化抖动类型硬编码为 WICBitmapDitherTypeErrorDiffusion.调色板转换类型为 硬编码为WICBitmapPaletteTypeMedianCut。ISupportInitialize 接口用于在以下情况下捕捉属性的值: 初始化完成。属性的进一步更改如下所示 忽略

显然抖动类型是硬编码的

格式转换位图 此类包装标准WIC像素格式 转换器(IwicMagingFactory::CreateFormatConverter)。此组件 提供从一种像素格式转换为另一种像素格式的方法, 处理索引格式的抖动和半色调,调色板 平移和alpha阈值。源、目标格式、, DestinationPalette和AlphaThreshold属性用于 通过初始化基础组件 IWICFormatConverter::初始化抖动类型硬编码为 WICBitmapDitherTypeErrorDiffusion.调色板转换类型为 硬编码为WICBitmapPaletteTypeMedianCut。ISupportInitialize 接口用于在以下情况下捕捉属性的值: 初始化完成。属性的进一步更改如下所示 忽略


我猜你的问题在这里:ScaleTransform ST=新的ScaleTransform(scale,scale);这不是消除混叠,而是缩放到更高分辨率的位图。尝试使用与输出设备相同的DPI渲染位图,不要缩放。@antlersoft您是对的。首先,我应该把它渲染成合适的大小。但这并没有改变我得到的结果。生成的文本位图仍然模糊。这显然是一个抗锯齿问题。渲染后位图看起来很好(当然是抗锯齿)。但是一旦我做了回忆,清晰的线条就消失了,我最终得到了一个非常模糊的图像。好吧,对于任何需要答案的人来说。我找到的唯一方法是将所有文本绘制到GDI+图形位图。然后将其转换为位图源我想你的问题在这里:ScaleTransform ST=新的ScaleTransform(scale,scale);这不是消除混叠,而是缩放到更高分辨率的位图。尝试使用与输出设备相同的DPI渲染位图,不要缩放。@antlersoft您是对的。首先,我应该把它渲染成合适的大小。但这并没有改变我得到的结果。生成的文本位图仍然模糊。这显然是一个抗锯齿问题。渲染后位图看起来很好(当然是抗锯齿)。但是一旦我做了回忆,清晰的线条就消失了,我最终得到了一个非常模糊的图像。好吧,对于任何需要答案的人来说。我找到的唯一方法是将所有文本绘制到GDI+图形位图。然后将其转换为位图源