C # / WPF image conversion over trapezoid

I have an image that I want to scale / stretch in a trapezoid in WPF. Is there an easy way to do this? I want to achieve a 3D effect / perspective / bend. It basically captures a 2D image and bends it in three-dimensional space.

This is what I want to accomplish:

original: new: * * * * * * * * 

One more note, I need this to happen very quickly. I tried using this code and the performance is unusable: http://www.vcskicks.com/image-distortion.php

Any help would be greatly appreciated. Thank you very much in advance!

+8
wpf image-manipulation
source share
1 answer

I think the easiest way to do this quickly is to use WPF 3D . Just set up the viewport with the perspective of the projection and put a square with the contents converted there, the GPU will do the rest.

WPF has a very nice MatrixTransform class that offers GPU-accelerated transformations in almost everything (and its derivatives, which simplify the application for the rotation transform example). Unfortunately, trapezoid transformation is not possible with a simple matrix transformation, it is mathematically limited by scaling, shifting and rotating (and their combinations).

EDIT: you can also see some examples here , 3D is really trivial in WPF.

EDIT 2:

here is the code that displays the general button displayed in the perspective view. Do not try to interact with it, google "WPF Interactive3D" if you want it.

If you want only the image to be displayed in 3D, you do not need to use VisualBrush.

In addition, the coordinates must be corrected, if you really want the matching content to fit the edges of the viewport, you will probably have to experiment a lot or calculate the math to calculate the coordinates. lease publish the result if you get something good (after clearing the code, I just edited the example I found somewhere).

And now you officially owe me your soul: 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> 
+10
source share

All Articles