c# SharpDX ScaleEffect插值问题

c# SharpDX ScaleEffect Interpolation question

我一直在使用这个出色的低影响屏幕录制软件库,但是我现在需要使用 DirectX 缩放效果通过各向异性过滤缩小图像。

我可以很好地创建效果并设置它的大部分参数,但是我无法为我设置最重要的参数 scaleEffect.SetValue((int)ScaleProperties.InterpolationMode, (int)SharpDX.Direct2D1.ScaleInterpolationMode.Anisotropic);

程序一运行就在该行崩溃并出现无效参数异常。 我已经搜索过,但没有发现代码有任何问题,但话又说回来,我对任何 Direct2D 的体验几乎为零。

具体效果的完整代码供参考:

SharpDX.Direct2D1.Effect scaleEffect = new D2D.Effect(textureDc, D2D.Effect.Scale);
scaleEffect.Cached = true;
scaleEffect.SetInput(0, frameBitmap, false);
var centerPoint = new SharpDX.Vector2(0, 0);
var newSize = new SharpDX.Vector2(0.2f, 0.2f);
scaleEffect.SetValue((int)ScaleProperties.CenterPoint, centerPoint);
scaleEffect.SetValue((int)ScaleProperties.Scale, newSize);

//Crashes Here: scaleEffect.SetValue((int)ScaleProperties.InterpolationMode, (int)SharpDX.Direct2D1.ScaleInterpolationMode.Anisotropic);
Error Message: SharpDX.SharpDXException: 'HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect.'

textureDc.BeginDraw();
textureDc.DrawImage(scaleEffect, InterpolationMode.Anisotropic);
textureDc.EndDraw();

非常感谢您的帮助!

更新:

根据@Simon Mourier 的评论,避免 SharpDX API 某处出现此错误的解决方案是改用 SharpDX.Direct2D1.Effects.Scale。 这样,我可以确认 InterpolationMode 不再崩溃并按预期工作!

这是适用于任何 运行 遇到相同问题的新代码。

SharpDX.Direct2D1.Effects.Scale scaleClass = new D2D.Effects.Scale(textureDc);
scaleClass.SetInput(0, frameBitmap,false);
scaleClass.Cached = true;
var centerPoint = new SharpDX.Vector2(0, 0);
var newSize = new SharpDX.Vector2(0.2f, 0.2f);
scaleClass.CenterPoint = centerPoint;
scaleClass.ScaleAmount = newSize;
scaleClass.InterpolationMode = InterpolationMode.Anisotropic;
textureDc.BeginDraw();
textureDc.DrawImage(scaleClass);
textureDc.EndDraw();

PS:对于任何想将值转换为 uint 而不是使用第一种方法的人,returns 会出现以下错误: (Argument1 无法从 uint 转换为 int) 因此,在这种特定情况下可能存在一些潜在错误。

一种解决方案是直接使用 SharpDX.Direct2D1.Effects.Scale,它是 Effect class 的包装器,并带有 InterpolationMode 属性。