2011-03-08 108 views
8

我有一張圖片,我想通過WPF中的梯形進行縮放/拉伸。有沒有一個簡單的方法來做到這一點?我想實現3D效果/透視/彎曲。基本上採用2D圖像並在3D空間中彎曲。梯形上的C#/ WPF圖像轉換

這是我想要完成的任務:

original:   new: 

* *    * * 

* *    *  * 

另外要注意的,我想這能非常快的發生。我嘗試使用此代碼,並且性能無法使用:http://www.vcskicks.com/image-distortion.php

任何幫助將不勝感激。提前感謝!

回答

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> 
+0

謝謝,我看這一點。我的最終目標是將3D Matrix變換應用於圖像並將其顯示在2D空間中。我還需要使用視口嗎? – 2011-03-08 20:35:19

+0

@Greg也許有一些庫(它是有道理的),這樣的UserControl可能很簡單。但是你不能用MatrixTransform類來做到這一點,它只是2D。也許如果你沒有找到任何東西並自己創建,你可以發佈它。我至少在SO之前看過這個問題(但無法找到它),所以人們對此感興趣。 – 2011-03-08 20:46:33

+0

得到一個真實的樣品會很棒,因爲這些東西都不是我正在尋找的東西。由於它不是一個直接的應用程序,所以很難將一個工作演示放在一起。 – 2011-03-09 15:07:00