2012-01-15 4 views
5

Ho creato un'app di disegno come test per WPF e sto andando bene. Il problema che ho riscontrato è che se disegno il pixel sotto il mouse su una bitmap ogni volta che si sposta, ottengo solo un pixel per aggiornamento. Quando il mouse si muove velocemente, non disegna i pixel in mezzo. Ho bisogno di sapere qual è il modo migliore per disegnare una linea tra di pixel è in WPF utilizzando WriteableBitmapIl disegno con il mouse causa spazi tra i pixel

EDIT: Ora ho questo:

LinesNotConnected

+0

Possibile duplicato: http://stackoverflow.com/questions/3000591/drawing-line-using-wpf-writeablebitmap-backbuffer –

risposta

3

Se si vuole disegnare una linea, si shouldn Basta cambiare i colori di un pixel alla volta, ma piuttosto salvare la posizione del mouse in ogni metodo di gestione degli eventi di MouseMove.

Quindi, si dovrebbe tracciare una linea tra la posizione precedente (quello salvato dal precedente verificarsi dell'evento) e disegnare un Line tra questi due punti. Ciò renderà la linea continua. Informazioni sulle linee di disegno su WriteableBitmap possono essere trovate qui: Drawing line using WPF WriteableBitmap.BackBuffer.

Dopo aver tracciato la linea, non dimenticare di aggiornare la posizione precedente salvata in quella corrente :).

UPDATE

Ho anche trovato un'altra soluzione.

Definire XAML con l'immagine che si desidera attingere:

<Window x:Class="SampleWPFApplication.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="500" Width="520" Loaded="Window_Loaded" PreviewMouseDown="Window_PreviewMouseDown"> 
<Grid x:Name="layoutRoot" Background="Transparent"> 
    <Image x:Name="image" /> 
</Grid> 

E poi, aggiungere il codice dietro con gli eventi trattati:

//set width and height of your choice 
RenderTargetBitmap bmp = null; 
//... 
private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //initialize RenderTargetBitmap object 
     bmp = new RenderTargetBitmap((int)this.ActualWidth, (int)this.ActualHeight, 90, 90, PixelFormats.Default); 

     //set initialized bmp as image's source 
     image.Source = bmp; 
    } 

    /// <summary> 
    /// Helper method drawing a line. 
    /// </summary> 
    /// <param name="p1">Start point of the line to draw.</param> 
    /// <param name="p2">End point of the line to draw.</param> 
    /// <param name="pen">Pen to use to draw the line.</param> 
    /// <param name="thickness">Thickness of the line to draw.</param> 
    private void DrawLine(Point p1, Point p2, Pen pen, double thickness) 
    { 
     DrawingVisual drawingVisual = new DrawingVisual(); 

     using (DrawingContext drawingContext = drawingVisual.RenderOpen()) 
     { 
      //set properties of the Pen object to make the line more smooth 
      pen.Thickness = thickness; 
      pen.StartLineCap = PenLineCap.Round; 
      pen.EndLineCap = PenLineCap.Round; 

      //write your drawing code here 
      drawingContext.DrawLine(pen, p1, p2); 
     } 
    } 
+0

In quale spazio dei nomi si trova la classe Bitmap? Devo usare classi da gdi +? – annonymously

+0

No, leggi la versione aggiornata della risposta. –

+0

OK ora funziona meglio ma le linee non sono collegate. Vedi la mia domanda aggiornata – annonymously

2

mi rendo conto che avete già avuto la tua domanda ha risposto, ma ha voluto postare per il bene di chiunque altro abbia questo problema. Io sono una di quelle persone

Avevo una situazione in cui i miei disegni erano identici alla sezione UPDATE nella domanda originale. Il modo in cui l'ho risolto era disegnando linee sovrapposte tenendo traccia non solo dei punti di inizio e di fine, ma anche di un punto medio. Quando disegno, disegno utilizzando tutti e tre i punti, quindi aggiorna il punto di inizio -> punto medio, punto medio -> punto finale, punto finale -> nuova posizione relativa a qualsiasi oggetto su cui stai disegnando. Questo ha reso le mie linee molto più belle.

Speriamo che questo sia utile a qualcuno che ha avuto lo stesso problema come me.