2016-12-01 2 views
1

Voici mon code WPF <InkCanvas x:Name="inkCanvas" Margin="9,325,210,193" Background="Azure"></InkCanvas> Et il y a un bouton Lorsque vous appuyez sur le bouton, je veux enregistrer l'image tirée dans un fichier. voici mon codeEnregistrement de l'image de InkCanvas comme fichier png ou 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); 
     } 
    } 

Mais l'image dusplayed est tout noir (whatching d'un explorateur) ou complitely blanc, si elle est ouverte dans la peinture. Que dois-je faire pour obtenir une image correctement dessinée? ty.

+0

un coup d'oeil: http://stackoverflow.com/questions/4067448/converting-image-to-bitmap -turns-background-black j'ai eu un problème similaire mais avec winForms – Alex

+0

@Alex ne semble pas si similaire que vous essayiez d'enregistrer un bitmap avec la transparence dans un encodeur qui ne le supportait pas, ce codeur le supporte, mais il peut être le format de pixel par défaut n'inclut pas un canal Alpha, ou il se peut que le rendu ne rende pas correctement l'arrière-plan et les vecteurs – MikeT

Répondre

2

Le problème est que vous essayez d'enregistrer Vector Graphics comme Bitmap et c'est pas possible, donc d'abord ce que vous devez faire est de dessiner les vecteurs et vous pouvez enregistrer le dessin

cette classe attirera l'encre sur une image bitmap existante

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); 
     } 
    } 
} 

vous pouvez ensuite enregistrer le bitmap en utilisant l'encodeur JPEG ou PNG

+3

Au lieu d'itérer sur tous les traits et de les dessiner individuellement, je suggère d'utiliser la méthode Draw de StrokeCollection à la place: ink.Draw (drawingContext); De cette façon, les traits de surligneurs sont dessinés correctement. – wilford