2015-02-24 74 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

你的意思是“高分辨率”?我不确定术语“高度分辨率”是什么意思。更一般地说:对于您的位图,您将需要指定所需分辨率的像素大小。请注意,A4纸上的300 dpi(大多数人认为最高分辨率为“高分辨率”)大约为2500像素宽,3500像素高;如果您使用屏幕坐标中的宽度和高度值,则一定会在A4纸上获得低分辨率图像。如果没有[良好的_minimal_,_complete_代码示例](http://stackoverflow.com/help/mcve),就不可能给出一个好的答案。 – 2015-02-25 01:00:33

+0

尝试[ScaleTransform](https://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform%28v=vs.110%29.aspx)控件并呈现此控件... – 2015-02-25 12:06:54

+1

不要打印出来。首先检查图像。这是你期望的吗? – usr 2015-02-25 12:22:43

回答

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()' – 2016-09-16 14:43:44

+0

而不是'encoder.Frames.Add(BitmapFrame.Create(this.CreateRenderTargetBitmap()));''调用'encoder.Frames.Add(BitmapFrame.Create(bmp) )' – 2016-10-18 17:19:35