2012-04-23 19 views
0

我有一個應用程序,打開一些XAML用戶控件成PNG圖像時 - 這真的很好到現在爲止,不幸的是我現在需要的圖像的規模擴大一倍。添加的TransformGroup到FramworkElement渲染WPF爲PNG

我的方法(即不工作!)是一個ScaleTransform添加到視覺元素我已經加載後...

此行是在SaveUsingEncoder方法的頂部的新生產線。

visual.RenderTransform = GetScaleTransform(2);

的PNG是新的大小(3000×2000) - 但XAML在1500x1000在圖像的中心呈現。

任何人都可以幫助嗎?

private void Load(string filename) 
    { 
     var stream = new FileStream(filename), FileMode.Open); 
     var frameworkElement = (FrameworkElement)(XamlReader.Load(stream)); 

     var scale = 2; 

     var encoder = new PngBitmapEncoder(); 
     var availableSize = new Size(1500 * scale, 1000 * scale); 

     frameworkElement.Measure(availableSize); 
     frameworkElement.Arrange(new Rect(availableSize)); 
     name = name.Replace(" ", "-"); 
     SaveUsingEncoder(frameworkElement, string.Format(@"{0}.png", name), encoder, availableSize); 
    } 

    private TransformGroup GetScaleTransform(int scale) 
    { 
     var myScaleTransform = new ScaleTransform {ScaleY = scale, ScaleX = scale}; 
     var myTransformGroup = new TransformGroup(); 
     myTransformGroup.Children.Add(myScaleTransform); 
     return myTransformGroup; 
    } 

    private void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder, Size size) 
    { 
     visual.RenderTransform = GetScaleTransform(2); 
     var bitmap = new RenderTargetBitmap(
      (int) size.Width, 
      (int) size.Height, 
      96, 
      96, 
      PixelFormats.Pbgra32); 
     bitmap.Render(visual); 

     var frame = BitmapFrame.Create(bitmap); 
     encoder.Frames.Add(frame); 

     using (var stream = File.Create(fileName)) 
     { 
      encoder.Save(stream); 
     } 
    } 
+0

如果你打電話的視覺會發生什麼[UpdateLayout請] (http://msdn.microsoft.com/en-us/library/system.windows.uielement.updatelayout.aspx)只是渲染到RenderTargetBitmap過嗎? – Clemens 2012-04-23 12:39:27

+0

這樣做,歡呼! – 2012-04-23 13:29:58

回答

0

渲染到RenderTargetBitmap

之前調用visual.UpdateLayout(感謝克萊門斯對這個答案! - 但他把它作爲一個評論)。