首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win2D关键石校正

Win2D关键石校正
EN

Stack Overflow用户
提问于 2016-01-29 21:07:12
回答 1查看 382关注 0票数 3

我正在尝试使用Win2D/C#来投射一个图像,使用一个高架投影仪,我需要使用一个Win2D效果来做Keystone校正(预扭曲图像)作为最后一步。

基本上,我正在绘制一个矩形,然后尝试在呈现之前使用一个Transform3DEffect来扭曲它。我不知道要用什么矩阵转换组合才能让它工作。做一个完整的相机投影似乎是过火,因为我只需要在一个方向弯曲(见下图)。我应该使用什么转换?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-07 10:43:11

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

https://i.stack.imgur.com/5QnEm.png

我不知道是什么导致了“弯曲”。

创建位移映射的代码(使用GDI+,因为您可以快速设置像素)。你能找到的LockBitmap 这里

代码语言:javascript
复制
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是加载的文件,屏幕外是我绘制网格的“CanvasRenderTarget”。

代码语言:javascript
复制
//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,
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35094073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档