消除边界效应

时间:2017-01-20 14:51:29

标签: c# graphics directx sharpdx

这是一个工作项目。我使用SharpDX(DirectX层)继承了一些代码。我的任务之一是修复一段代码,其中某些图像效果应用于包含填充的几何形状。如果过滤器应用于填充物本身,则它不符合边缘。我已经找到了使用对象的几何来提取摘录的代码。由于各种原因,他们希望保持形状之外存在的填充(即,我们有一些扭曲效果,将像素拉到形状之外),因此我需要将其覆盖在背景上。我遇到的问题是我得到了这个单像素边框......

将软边缘滤镜应用于可见部分
Blurred interior

形状剪裁的背景
Outside image

两个在程序中合成在一起
Composited

我实际上得到了什么
What I'm actually getting

由于部分代码是专有的,我无法共享一些代码,但掩码是一个字节数组。我使用以下代码构建它:

SingleChannelBitmap mask = new SingleChannelBitmap(MaxRequiredPixels.Width, MaxRequiredPixels.Height, 255);
mask.FillShape(new RectangleF(new PointF(0,0), mask.Size), this.Geometry, 0);

255是最大Alpha值(透明)。我将其反转以将切片从背景中取出。我唯一能想到的是,当我进行遮蔽时,它不包括几何的外边缘。我将尝试以最粗糙的方式将掩模扩展一个像素(基本上,扫描并采取任何0透明度并向左,向右,向上和向下添加0透明像素),但是我知道必须有一个更优雅的解决方案。

这也适用于3D Edge斜角滤镜,所以做一个任意大的空白可能对我来说也不起作用。

1 个答案:

答案 0 :(得分:1)

您所描述的内容基本上与显示PNG图像时出现的晕圈问题相同。来自多个程序的PNG导出过程将为PNG中具有零alpha的任何部分存储纯色,而不是这些像素处的实际颜色。这使得它们的功能类似于使用特定颜色来编码透明像素的其他图像格式(GIF)。这会显着减小文件的大小,但是,在对图像进行采样时可能会出现问题。

你的情况很相似。虽然屏蔽像素的alpha值为零,但在进行双线性采样时,您可以在像素之间进行采样,混合颜色和alpha值(除非像素和纹素中心完全对齐)。例如,如果您有一个100%的alpha,白色像素,0%的alpha红色像素旁边,以及两者之间的样本,则结果将是50%alpha的粉红色像素。

有几种可能的解决方案:

  • 您可以扩展颜色图层的边框,以使0%Alpha边框与其非0%alpha相邻像素具有相同的颜色。
  • 有意识地排列像素和纹素中心,尽管这可能很棘手和/或不可能,这取决于您的要求(主要取决于分辨率)。
  • 在显示图像时使用“最近”采样,而不是双线性采样。这样,您永远不会混合0%的alpha像素。但是,这可能也不合适,因为您的图像可能会出现更多的锯齿效果。