2016-01-29 33 views
2

我試圖使用Win2D/C#使用高射投影儀投影圖像,並且我需要使用Win2D效果來做Keystone Correction(預翹圖像)作爲最後一步。Win2D Keystone Correction

基本上我畫了一個矩形,然後嘗試使用Transform3DEffect在渲染前對其進行變形。我無法弄清楚使用什麼Matrix轉換組合來實現它。做一個完整的相機投影似乎是矯枉過正,因爲我只需要在一個方向上扭曲(見下圖)。我應該使用什麼變換?

enter image description here

+0

主要問題是,Transform3DEffect不會添加透視圖。所以我認爲你不能這樣做。 (就我的想法而言,我沒有時間進一步調查...... atm)。還有一個想法:你可能可以通過置換貼圖來解決這個問題。 – AntiHeadshot

回答

0

使用像下面的圖片,可以讓你類似的效果。

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

enter image description here

我不確定在 「彎曲」 什麼樣的結果。

創建位移貼圖的代碼(使用GDI +,因爲您可以快速設置像素)。 的LockBitmap你可以找到here

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」上,我畫了電網。

//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

我認爲這種技術對於我來說有一個不同的(更簡單的)位移圖像。謝謝。 – user1346563