Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Direct2D在透明背景上呈现ClearType文本?_C#_Direct2d_Sharpdx_Cleartype - Fatal编程技术网

C# 如何使用Direct2D在透明背景上呈现ClearType文本?

C# 如何使用Direct2D在透明背景上呈现ClearType文本?,c#,direct2d,sharpdx,cleartype,C#,Direct2d,Sharpdx,Cleartype,谁能告诉我为什么ClearType在下面的简单SharpDX示例中拾取背景的透明度?以及如何阻止它这样做 它将两行纯黑色文本渲染为半透明位图。第一行使用灰度渲染,第二行使用ClearType渲染 编辑:有人认为问题在于曲面被预乘。但这并不能解释两种灰度/清晰类型渲染之间的差异 结果(win7): publicstaticvoidmain() { var pixelFormat=SharpDX.WIC.pixelFormat.Format32bppPBGRA; 使用(var wicFactory

谁能告诉我为什么ClearType在下面的简单SharpDX示例中拾取背景的透明度?以及如何阻止它这样做

它将两行纯黑色文本渲染为半透明位图。第一行使用灰度渲染,第二行使用ClearType渲染

编辑:有人认为问题在于曲面被预乘。但这并不能解释两种灰度/清晰类型渲染之间的差异

结果(win7):

publicstaticvoidmain()
{
var pixelFormat=SharpDX.WIC.pixelFormat.Format32bppPBGRA;
使用(var wicFactory=new ImagingFactory())
使用(var dddFactory=new SharpDX.Direct2D1.Factory())
使用(var dwFactory=new SharpDX.DirectWrite.Factory())
使用(var textFormat=新的textFormat(dwFactory,“Arial”,fontwweight.Bold,FontStyle.Normal,48))
使用(var textLayout=新的textLayout(dwFactory,“argle bargle”,textFormat,float.PositiveInfinity,float.PositiveInfinity))
{
var width=(int)Math.天花(textLayout.Metrics.width);
var height=(int)Math.天花(textLayout.Metrics.height);
使用(var wicBitmap=new SharpDX.WIC.Bitmap(
WIC工厂,
宽度,高度*2,
像素格式,
BitmapCreateCacheOption.CacheOnLoad)
{
var renderTargetProperties=新的renderTargetProperties(新的SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm,AlphaMode.Premultiplied));
Color4 textColor=新的Color4(0f、0f、0f、1f);
使用(var renderTarget=new WicRenderTarget(dddFactory、wicBitmap、renderTargetProperties))
使用(var textBrush=new SolidColorBrush(renderTarget,textColor))
{
renderTarget.BeginDraw();
renderTarget.Clear(新颜色4(1f、1f、0f、.25f));
renderTarget.TextAntialiasMode=TextAntialiasMode.Grayscale;
DrawTextLayout(新矢量2(0,0),textLayout,textBrush);
renderTarget.TextAntialiasMode=TextAntialiasMode.Cleartype;
DrawTextLayout(新矢量2(0,高度),textLayout,textBrush);
renderTarget.EndDraw();
}
var path=path.Combine(path.GetTempPath(),“test.png”);
使用(var stream=File.OpenWrite(path))
{
使用(var编码器=新的PngBitmapEncoder(wicFactory,stream))
使用(var frameEncoder=新的位图frameencode(编码器))
{
frameEncoder.Initialize();
frameEncoder.WriteSource(wicBitmap);
frameEncoder.Commit();
Commit();
}
}
}
}
}

此意外结果是一种“正常”行为

如MSDN所示:

如果指定的alpha模式不是D2D1_alpha_模式,则忽略 渲染目标时,文本抗锯齿模式会自动从 D2D1_文本_反别名_模式CLEARTYPE至D2D1_文本_反别名_模式 灰度

所以,第一次将
renderTarget.TextAntialiasMode
赋值给灰度是毫无意义的,因为
Grayscale
是它最初设定的值

MSDN的另一句话:

可以使用SetTextAntialiasMode方法更改文本 反别名模式返回到D2D1\u文本\u反别名\u模式CLEARTYPE,但 将ClearType文本渲染到透明曲面可以创建 不可预测的结果。如果要将ClearType文本呈现给 透明渲染目标,建议您使用 下面是两种技巧

  • 使用PushAxisAlignedClip方法将渲染目标剪裁到 将呈现文本的区域,然后调用Clear方法和 指定不透明颜色,然后渲染文本
  • 使用DrawRectangle在将渲染文本的区域后面绘制不透明矩形
全文如下:

因此,如果我必须总结一下:

  • 不要将
    D2D1\u TEXT\u antialas\u MODE\u CLEARTYPE
    设置为alpha模式不同于
    D2D1\u alpha\u MODE\u IGNORE的渲染目标
  • 遵循上面的技巧

  • 此行为是预期的,因为曲面已预乘()。你应该解释你真正期望的是什么。我希望灰度和cleartype渲染是一致的。如果不能创建非预乘曲面呢?谢谢。所以基本上答案是你不能:所描述的两种“替代”技术都不能产生预期的结果。我想唯一的方法是渲染到一个单独的位图,然后手动进行alpha混合。