禁用从画布渲染的黑白位图的抗锯齿
本文关键字:位图 黑白 布渲染 | 更新日期: 2023-09-27 18:00:49
我对WPF的文本抗锯齿有问题。在我的应用程序中,用户设计要使用特殊打印设备打印的文本或图像字段。我正在使用画布来托管字段,这些字段要么是文本块,要么是图像
问题是,当我将此画布转换为RenderTargetBitmap,然后转换为黑白FormatConvertedBitmap时,文本和图像看起来非常模糊。
我尝试过在应用程序中的所有内容上使用"snaptodevicepixels=true"answers"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;
}
在创建rendertargetbitmap之前,如何关闭antiilasing?
http://blogs.msdn.com/b/dwayneneed/archive/2008/06/20/implementing-a-custom-bitmapsource.aspx
显然抖动类型是硬编码
格式转换位图
此类包装标准的WIC像素格式转换器(IWICImagingFactory::CreateFormatConverter(。此组件提供了从一种像素格式转换为另一种像素形式的手段,将抖动和半色调处理为索引格式、调色板平移和阿尔法阈值。Source、DestinationFormat,DestinationPalette和AlphaThreshold属性用于通过初始化基础组件IWICFormatConverter::初始化抖动类型被硬编码为WICBitmapDitherTypeErrorDiffusion调色板翻译类型为硬编码为WICBitmapPaletteTypeMedianCut。ISupportInitialize接口用于在以下情况下捕捉属性的值初始化完成。属性的进一步更改已忽略。