2015-02-24 3 views
-1

У меня есть FrameworkElement, и я хочу сохранить его как изображение с высоким разрешением (Jpeg). Я попробовал следующий код, но результаты не то, что я надеялся. У меня есть изображение с плохим разрешением, когда я печатаю его с размером A4 в качестве размера бумаги.Как создать изображение с высоким разрешением из элемента FrameworkElement?

 // ... 
     FrameworkElement element = this.Content;   
     element.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity)); 
     element.Arrange(new Rect(element.DesiredSize)); 
     element.UpdateLayout(); 

     // i used element.ActulaHeight and ActualWidth but not works. 
     RenderTargetBitmap bitmap = new RenderTargetBitmap((int)element.Width, (int)element.Height, GPFReporstPageSizeExtension.DPI, GPFReporstPageSizeExtension.DPI, System.Windows.Media.PixelFormats.Pbgra32); 
     bitmap.Render(element); 
     // .... 
+2

ли вы имеете в виду «высокое разрешение»? Я не уверен, что означает термин «Разрешение по высоте». В более общем плане: для вашего растрового изображения вам нужно указать размер пикселя требуемого разрешения. Обратите внимание, что 300 dpi (о самом низком большинстве людей считают «высокое разрешение») на бумаге формата А4 составляет примерно 2500 пикселей по ширине на 3500 пикселей; если вы используете значения ширины и высоты из ваших координатов экрана, вы обязательно получите изображение с низким разрешением на листе A4. Без [хорошего, _minimal_, _complete_ кода примера] (http://stackoverflow.com/help/mcve) невозможно дать хороший ответ. –

+0

Попробуйте [ScaleTransform] (https://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform%28v=vs.110%29.aspx) элемент управления и визуализируйте этот элемент управления ... –

+1

Не распечатывайте его. Сначала проверьте изображение. Это то, чего вы ожидаете? – usr

ответ

0

Наконец я решил мою проблему, я опубликовал полное решение в своем блоге «gamadev веб-сайт»: Saving FrameworkElement as Image

FrameworkElement element = myControl.Content; 
// you can set the size as you need. 
Size theTargetSize = new Size(1500,2000) 
element.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity)); 
element.Arrange(new Rect(theTargetSize)); 
// to affect the changes in the UI, you must call this method at the end to apply the new changes 
element.UpdateLayout(); 

double dpiScale = 300.0/96; 

double dpiX = 300.0; 
double dpiY = 300.0; 
RenderTargetBitmap bmp = new RenderTargetBitmap(Convert.ToInt32(
(theTargetSize .Width) * dpiScale), 
Convert.ToInt32((theTargetSize .Height) * dpiScale), 
dpiX, dpiY, PixelFormats.Pbgra32); 

bmp.Render(element); 

element.Measure(new System.Windows.Size()); 
element.Arrange(new Rect()); 
element.UpdateLayout(); 

System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); 
MemoryStream myStream = new MemoryStream(); 
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(this.CreateRenderTargetBitmap())); 
encoder.Save(myStream); 
var img = System.Drawing.Bitmap.FromStream(myStream); 

Bitmap bmp = new Bitmap((int)theTargetSize .Width, (int)theTargetSize .Height); 

var g = Graphics.FromImage(bmp); 
g.Clear(System.Drawing.Color.White); 

g.DrawImage(this.GetPageAsImage(), (int)this.Margin.Left, (int)this.Margin.Top); 
fileName = @”D:\myImage.png”; 
bmp.Save(fileName); 
+0

Этот бит необъяснен: 'this.CreateRenderTargetBitmap()' –

+0

Вместо 'encoder.Frames.Add (BitmapFrame.Create (this.CreateRenderTargetBitmap()));' call' encoder.Frames.Add (BitmapFrame.Create (bmp)) ' –

Смежные вопросы