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);
}
}
如果你打電話的視覺會發生什麼[UpdateLayout請] (http://msdn.microsoft.com/en-us/library/system.windows.uielement.updatelayout.aspx)只是渲染到RenderTargetBitmap過嗎? – Clemens 2012-04-23 12:39:27
這樣做,歡呼! – 2012-04-23 13:29:58