如何修改 SharpDX 高斯模糊操作以使边缘不透明?
How do I modify the SharpDX Gaussian Blur operation to not make the edges transparent?
我正在维护一段使用 SharpDX 进行图形操作的遗留代码。部分代码采用锯齿图案并对其进行模糊处理,为撕破的纸张创建锯齿状边缘效果。我们遇到了一个奇怪的错误,效果周围有一条微弱的白线。通过代码,我发现显然模糊操作在边缘周围创建了一个小的透明边框。
这里是定义模糊的代码Class:
public class DXEffectBlur : DXEffect
{
public DXEffectBlur(DXSurface Owner, DXImage Source0, float Sigma)
: base(Owner)
{
szPixels = Source0.SizePixels;
SharpDX.Direct2D1.Effects.GaussianBlur blur = new SharpDX.Direct2D1.Effects.GaussianBlur(surface.CurrentRender);
blur.StandardDeviation = Sigma;
blur.SetInput(0, Source0.Image, true);
blur.Optimization = GaussianBlurOptimization.Quality;
blur.BorderMode = BorderMode.Hard;
effect = blur;
}
}
模糊在以下代码块中被调用为 blur 以将效果写入表面:
using (SurfaceSupport ss = new SurfaceSupport(surface, ReadSource, true))
using (DXEffectBlur blur = new DXEffectBlur(surface, ss.Image, Sigma))
using (DXEffectUnPremultiply unmul = new DXEffectUnPremultiply(surface, blur))
using (DXLayer layer = new DXLayer(surface, rc, null, false, ss.Mask, 1F))
{
surface.DrawImage(unmul, rc, 1F);
}
其中 rc 是覆盖我们表面的矩形,1F 是不透明度。
是否有更好的方法来指定 SharpDX 中的模糊,使其不会使边缘半透明?我将继续研究代码,但我今天已经投入了一个小时,而且我不熟悉 SharpDX,甚至不熟悉 DirectX,所以如果您能提供有关查找位置的任何指示,我将不胜感激。我已经尝试弄乱 BorderMode,它默认为 Soft,但在模糊时设置为 Hard,但 Soft 只是为了更宽的透明度边界。
在同事的帮助下,我找到了解决方法。在构造函数中,我添加了以下行:
Owner.InterpolationMode = DXInterpolationMode.Fast;
如上所示,"Owner"是效果的DXSurface。它被分配给 DXResource
中的 surface
成员变量,它是链上几层的祖先,因此在此处更改它也会更改成员变量。
之前,设置为 HighQuality
。使用 Pixel
设置也有效。
我正在维护一段使用 SharpDX 进行图形操作的遗留代码。部分代码采用锯齿图案并对其进行模糊处理,为撕破的纸张创建锯齿状边缘效果。我们遇到了一个奇怪的错误,效果周围有一条微弱的白线。通过代码,我发现显然模糊操作在边缘周围创建了一个小的透明边框。
这里是定义模糊的代码Class:
public class DXEffectBlur : DXEffect
{
public DXEffectBlur(DXSurface Owner, DXImage Source0, float Sigma)
: base(Owner)
{
szPixels = Source0.SizePixels;
SharpDX.Direct2D1.Effects.GaussianBlur blur = new SharpDX.Direct2D1.Effects.GaussianBlur(surface.CurrentRender);
blur.StandardDeviation = Sigma;
blur.SetInput(0, Source0.Image, true);
blur.Optimization = GaussianBlurOptimization.Quality;
blur.BorderMode = BorderMode.Hard;
effect = blur;
}
}
模糊在以下代码块中被调用为 blur 以将效果写入表面:
using (SurfaceSupport ss = new SurfaceSupport(surface, ReadSource, true))
using (DXEffectBlur blur = new DXEffectBlur(surface, ss.Image, Sigma))
using (DXEffectUnPremultiply unmul = new DXEffectUnPremultiply(surface, blur))
using (DXLayer layer = new DXLayer(surface, rc, null, false, ss.Mask, 1F))
{
surface.DrawImage(unmul, rc, 1F);
}
其中 rc 是覆盖我们表面的矩形,1F 是不透明度。
是否有更好的方法来指定 SharpDX 中的模糊,使其不会使边缘半透明?我将继续研究代码,但我今天已经投入了一个小时,而且我不熟悉 SharpDX,甚至不熟悉 DirectX,所以如果您能提供有关查找位置的任何指示,我将不胜感激。我已经尝试弄乱 BorderMode,它默认为 Soft,但在模糊时设置为 Hard,但 Soft 只是为了更宽的透明度边界。
在同事的帮助下,我找到了解决方法。在构造函数中,我添加了以下行:
Owner.InterpolationMode = DXInterpolationMode.Fast;
如上所示,"Owner"是效果的DXSurface。它被分配给 DXResource
中的 surface
成员变量,它是链上几层的祖先,因此在此处更改它也会更改成员变量。
之前,设置为 HighQuality
。使用 Pixel
设置也有效。