2009-07-01 5 views
3

J'ai une application C# winForm qui contient un contrôle pictureBox. Ce contrôle a un événement Paint. Chaque fois que l'événement paint est déclenché, un bitmap est créé dynamiquement et j'y dessine un dessin. Et lorsque l'utilisateur clique sur le bouton "enregistrer", l'image éditée est enregistrée en tant que fichier jpg.Comment effacer du contenu sur une image bitmap

C'est OK jusqu'à maintenant. Lorsque je charge une nouvelle image dans le contrôle pictureBox, les restes des modifications précédentes sont toujours actifs.

Comment puis-je effacer le bitmap et prendre un nouveau départ chaque fois que je charge une nouvelle image:

private void pb_Resim_Paint(object sender, PaintEventArgs e) 
{ 
    List<eVucutParcalari> list = new List<eVucutParcalari>(pointList.Keys); 
    // Loop through list 
    foreach (eVucutParcalari k in list) 
    { 
    Dictionary<Point, Color> dicItem = pointList[k]; 
    foreach (KeyValuePair<Point, Color> pair in dicItem) 
    { 
     Point p = pair.Key; 
     Color c = pair.Value; 
     SolidBrush brush = new SolidBrush(c); 

     if (pb_Resim.Image == null) 
     return; 
     Bitmap bmp = new Bitmap(pb_Resim.Image); 
     Graphics gr = Graphics.FromImage(bmp); 
     gr.FillRectangle(brush, p.X, p.Y, 5, 5); 
     pb_Resim.Image = bmp; 
    } 
    } 
} 

Répondre

2

Pourquoi ne pas créer une marque nouvelle image lorsque vous chargez un nouveau fichier et remplacez le bitmap actuellement affecté à pb_Resim .Image sur le chargement? Cela permettrait à l'ancien bitmap d'être collecté par le GC sans vous obliger à déployer des efforts pour «effacer» le bitmap précédent et vous assurer que vous disposez d'un nouveau bitmap frais sans aucun résidu résiduel d'aucune sorte pour le nouveau fichier chargé.

0

Christian Graus a écrit plusieurs articles sur GDI +, que vous pouvez trouver sur CodeProject. (Faites défiler vers le bas pour les articles GDI +.) Comme ils se rapportent directement au type d'activité que vous faites, je suggère de les parcourir.

0

Je pense que vous vouliez dire désactivez la case à l'image du contenu précédent qui se trouve être l'objet bitmap d'un fichier image.

Vous avez déjà fait nouvelle brosse, nouvelle image, obtenir de nouvelles toile graphique du nouveau bitmap.

Une chance de faire un nouveau PictureBox?

Parce que ce que j'ai fait lorsque mon application devait afficher de façon répétée rapide et sale un ensemble d'images. Je suis sûr qu'il existe une meilleure façon d'effacer la zone d'image, comme l'utilisation de refresh().

foreach (...) 
{ 
    pb_Resim = new PictureBox(); 
    configPictureBoxDimensions(); 

    ... 

} 

Pourquoi n'essayez-vous pas refresh() en premier? Ça devrait marcher.

foreach (...) 
{ 
    pb_Resim = bmp; 
    pb_Resim.refresh(); 

    ... 

} 
Questions connexes