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