Win2D 梯形校正

3
我正在尝试使用Win2D/C#通过投影仪投影图像,需要使用Win2D效果进行Keystone校正(预先扭曲图像)作为最后一步。基本上,我正在绘制一个矩形,然后尝试在渲染之前使用Transform3DEffect进行变形。我无法弄清楚要使用哪种矩阵变换组合才能使其工作。进行完整的相机投影似乎过于复杂,因为我只需要单向扭曲(请参见下面的图像)。我应该使用哪些转换?

enter image description here


主要问题在于,Transform3DEffect不会添加透视效果。所以我认为你无法这样做。(这只是我的想法,我暂时没有时间进一步调查...)。另一个想法是:您可以通过位移映射来解决这个问题。 - AntiHeadshot
1个回答

0
使用以下类似的图像,可以获得类似的效果。

https://istack.dev59.com/5QnEm.webp

enter image description here

我不确定是什么导致了“弯曲”。

用 GDI+ 创建位移图的代码(因为你可以快速设置像素)。 你可以在这里找到 LockBitmap。

static void DrawDisplacement(int width, int height, LockBitmap lbmp)
    {
        for (int x = 0; x < width; x++)
            for (int y = 0; y < height; y++)
            {
                int roff = (int)((((width >> 1) - x) / (float)(width >> 1)) * ((height - y) / (float)height) * 127);
                int goff = 0;

                lbmp.SetPixel(x, y, Color.FromArgb(127 - roff, 127 - goff, 0));
            }
    }

在Win2D中绘图看起来像这样,其中displacementImage是加载的文件,offscreen是一个“CanvasRenderTarget”,我在上面绘制了网格。
//Scaling for fitting the image to the content
ICanvasImage scaledDisplacement = new Transform2DEffect
{
    BorderMode = EffectBorderMode.Hard,
    Source = displacementImage,
    TransformMatrix = Matrix3x2.CreateScale((float) (sender.Size.Width / displacementImage.Bounds.Width), (float) (sender.Size.Height / displacementImage.Bounds.Height)),
    Sharpness = 1f,
    BufferPrecision = CanvasBufferPrecision.Precision32Float,
    InterpolationMode = CanvasImageInterpolation.HighQualityCubic,
};

//Blurring, for a better result
ICanvasImage displacement = new GaussianBlurEffect
{
    BorderMode = EffectBorderMode.Hard,
    Source = scaledDisplacement,
    BufferPrecision = CanvasBufferPrecision.Precision32Float,
    BlurAmount = 2,
    Optimization = EffectOptimization.Quality,
};

ICanvasImage graphicsEffect = new DisplacementMapEffect
{
    Source = offscreen,
    Displacement = displacement,
    XChannelSelect = EffectChannelSelect.Red,
    YChannelSelect = EffectChannelSelect.Green,
    Amount = 800,//change for more or less displacement
    BufferPrecision = CanvasBufferPrecision.Precision32Float,
};

我认为这种技术使用另一种(更简单)的位移图像对我会起作用。谢谢。 - user1346563

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接