在梯形上进行C#/ WPF图像转换

时间:2011-03-08 20:18:02

标签: wpf image-manipulation

我有一个图像,我想在WPF中的梯形上缩放/拉伸它。这样做有简单的方法吗?我想实现3D效果/透视/弯曲。基本上拍摄2D图像并将其在3D空间中弯曲。

这就是我想要完成的事情:

original:          new:

 *  *               *  *

 *  *             *      *

另一个注意事项,我需要这么快发生。我尝试使用此代码,但性能无法使用:http://www.vcskicks.com/image-distortion.php

非常感谢任何帮助。非常感谢提前!

1 个答案:

答案 0 :(得分:10)

我认为最快速的方法是使用WPF 3D。只需设置一个带有透视投影的视口,然后放置一个四边形,其中包含要转换的内容,GPU将完成剩下的工作。

WPF有一个非常好的MatrixTransform类,它提供几乎任何东西的GPU加速转换(及其衍生物,简化了旋转转换的应用)。遗憾的是,梯形变换不可能与简单矩阵变换有关,这些变换在数学上仅限于缩放,剪切和旋转(及其组合)。

编辑:您还可以看到一些示例here,3D在WPF中非常简单。

编辑2:

这里是显示透视图中显示的公共按钮的代码。不要试图与它互动,如果你想要谷歌“WPF Interactive3D”。

如果只想在3D视图中显示图像,则不必使用VisualBrush。

此外,如果您确实希望映射的内容适合视口的边缘,则必须修复坐标,您可能需要进行大量的实验或一些数学来计算坐标。如果你得到一些好的东西(在你清理代码之后,我刚刚编辑了一个我在某处找到的例子),就可以发布结果。

你现在正式欠你我的灵魂:D

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DockPanel>
        <Viewport3D>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D
                                Positions="-0.5  0.5  -0.5,  0.5  0.5  -0.5,
                                           -0.5  0  0.5,  0.5  0  0.5"
                                TriangleIndices=" 0  2  1,  1  2  3"
                                TextureCoordinates="0 0, 1 0, 0 1, 1 1" />
                        </GeometryModel3D.Geometry>

                        <GeometryModel3D.Material>
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <VisualBrush>
                                        <VisualBrush.Visual>
                                            <Button>Hi</Button>
                                        </VisualBrush.Visual>
                                    </VisualBrush>
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>                              
                        </GeometryModel3D.Material>

                        <!-- Non-Affine Matrix Transform. -->
                        <GeometryModel3D.Transform>
                            <MatrixTransform3D>
                            </MatrixTransform3D>
                        </GeometryModel3D.Transform>

                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>

            <!-- Light sources. -->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup>
                        <AmbientLight Color="#404040" />
                        <DirectionalLight Color="#C0C0C0" Direction="0 -2 -1" />
                    </Model3DGroup>
                </ModelVisual3D.Content>
            </ModelVisual3D>

            <!-- Camera. -->
            <Viewport3D.Camera>
                <PerspectiveCamera Position="0 0.2 1"
                                   LookDirection="0 0 -1.5"
                                   UpDirection="0 1 0"
                                   FieldOfView="100">
                </PerspectiveCamera>
            </Viewport3D.Camera>
        </Viewport3D>
    </DockPanel>
</Window>