2009-05-27 8 views
3

Je voudrais utiliser GDI + pour rendre une image sur un fil d'arrière-plan. J'ai trouvé this example sur la façon de faire pivoter une image en utilisant GDI +, qui est l'opération que je voudrais faire.GDI +: comment rendre un objet Graphics à un bitmap sur un thread d'arrière-plan?

private void RotationMenu_Click(object sender, System.EventArgs e) 
{ 
    Graphics g = this.CreateGraphics(); 
    g.Clear(this.BackColor); 
    Bitmap curBitmap = new Bitmap(@"roses.jpg"); 
    g.DrawImage(curBitmap, 0, 0, 200, 200); 

    // Create a Matrix object, call its Rotate method, 
    // and set it as Graphics.Transform 
    Matrix X = new Matrix(); 
    X.Rotate(30); 
    g.Transform = X; 

    // Draw image 
    g.DrawImage(curBitmap, 
    new Rectangle(205, 0, 200, 200), 
     0, 0, curBitmap.Width, 
     curBitmap.Height, 
     GraphicsUnit.Pixel); 

    // Dispose of objects 
    curBitmap.Dispose(); 
    g.Dispose(); 
} 

Ma question comporte deux parties:

  1. Comment vous accomplissez this.CreateGraphics() sur un fil de fond? C'est possible? Ma compréhension est qu'un objet d'interface utilisateur est this dans cet exemple. Donc, si je fais ce traitement sur un thread d'arrière-plan, comment créer un objet graphique? Comment puis-je extraire un bitmap de l'objet Graphics que j'utilise une fois le traitement terminé?

  2. Je n'ai pas été capable de trouver un bon exemple de comment faire cela.


également: lors du formatage d'un exemple de code, comment puis-je ajouter des nouvelles lignes? Si quelqu'un pouvait me laisser un commentaire expliquant que je l'apprécierais vraiment. Merci!

Répondre

12

Pour dessiner sur un bitmap, vous ne souhaitez pas créer un objet Graphics pour un contrôle d'interface utilisateur. Vous créez un objet Graphics pour le bitmap en utilisant la méthode FromImage:

Graphics g = Graphics.FromImage(theImage); 

Un objet Graphics ne contient pas les graphiques que vous dessinez à elle, au lieu qu'il est juste un outil pour dessiner sur une autre toile, qui est généralement le écran, mais il peut également s'agir d'un objet Bitmap.

Donc, vous ne faites pas d'abord, puis extraire le bitmap, vous créez le bitmap, puis créer l'objet Graphics de tirer dessus:

Bitmap destination = new Bitmap(200, 200); 
using (Graphics g = Graphics.FromImage(destination)) { 
    Matrix rotation = new Matrix(); 
    rotation.Rotate(30); 
    g.Transform = rotation; 
    g.DrawImage(source, 0, 0, 200, 200); 
} 
+0

Ahh, qui est intéressant. Cela clarifie définitivement une partie du mystère. Je vais essayer ça. Merci! –

Questions connexes