2016-12-01 147 views
1

這是我的wpf代碼 <InkCanvas x:Name="inkCanvas" Margin="9,325,210,193" Background="Azure"></InkCanvas> 還有一個按鈕 當按下按鈕時,我想要將圖像保存到文件中。這裏是我的代碼將inkCanvas中的圖像保存爲png或jpeg文件

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     int margin = (int)inkCanvas.Margin.Left; 
     int width = (int)inkCanvas.ActualWidth - margin; 
     int height = (int)inkCanvas.ActualHeight - margin; 
     RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default); 
     rtb.Render(inkCanvas); 


     using (FileStream fs = new FileStream("path", FileMode.Create)) 
     { 
      BitmapEncoder encoder = new PngBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(rtb)); 
      encoder.Save(fs); 
     } 
    } 

但圖像dusplayed是全黑的(從資源whatching)或complitely白色,如果油漆打開。 我如何繪製完整的圖像? TY。

+0

看一看:http://stackoverflow.com/questions/4067448/converting-image-to-bitmap -turns-background-black我有一個類似的問題,但winForms – Alex

+0

@Alex似乎沒有那麼相似,您試圖在不支持它的編碼器中使用透明度保存位圖,但此編碼器確實支持它,但它可能是默認的像素格式不包括Alpha通道,或者可能是渲染不能正確渲染背景和矢量 – MikeT

回答

2

的問題是,您要的矢量圖形保存爲位圖,那不可能的,所以首先你需要做的就是繪製矢量,然後你可以保存圖形

該類會畫水墨到一個現有的位圖

public class InkImage 
{ 
    public static BitmapFrame MergeInk(StrokeCollection ink, BitmapSource background) 
    { 
     DrawingVisual drawingVisual = new DrawingVisual(); 
     using (DrawingContext drawingContext = drawingVisual.RenderOpen()) 
     { 
      drawingContext.DrawImage(background, new Rect(0, 0, background.Width, background.Height)); 

      foreach (var item in ink) 
      { 
       item.Draw(drawingContext); 
      } 
      drawingContext.Close(); 
      var bitmap = new RenderTargetBitmap((int)background.Width, (int)background.Height, background.DpiX, background.DpiY, PixelFormats.Pbgra32); 
      bitmap.Render(drawingVisual); 
      return BitmapFrame.Create(bitmap); 
     } 
    } 
} 

可以使用JPEG或PNG編碼器然後保存該位圖

+3

而不是遍歷所有筆畫並單獨繪製它們,我建議使用StrokeCollection的Draw方法:ink.Draw(drawingContext);這種方式熒光筆筆畫也正確繪製。 – wilford

相關問題