2009-11-14 4 views
4

Je dessine beaucoup d'images (toutes les dimensions = 24x24 pixelformat = 32BppPArgb) sur un contrôle en utilisant un objet Drawing.Graphics et la fonction DrawImage(). Il est possible d'effectuer un zoom arrière dans mon application, ce qui signifie que l'objet Graphics est associé à une matrice de transformation qui contrôle à la fois le zoom et le panoramique.Dessiner une image avec transparence personnalisée dans GDI +

Il ne sert à rien de dessiner ces icônes lorsque le zoom tombe en dessous de 50%, mais j'aimerais faire la transition entre dessiner des icônes et ne pas dessiner des icônes plus lisses. C'est-à-dire qu'à partir de 70%, les icônes doivent être dessinées avec un facteur de transparence supplémentaire afin qu'elles deviennent complètement transparentes à 50%.

Comment puis-je dessiner un bitmap avec une transparence supplémentaire sans qu'il prenne beaucoup plus de temps que DrawImage()?

Merci, David

+0

Je réalise qu'il s'agit d'une question GDI +, mais avez-vous envisagé de passer à WPF? Cela rend les choses de ce genre absolument insignifiantes et offre également une foule d'autres avantages. Il semble que votre application soit suffisamment complexe pour bénéficier des fonctionnalités avancées de WPF. –

+0

@Ray, cela impliquerait une réécriture de plus de 50% d'une application qui m'a pris 3 ans à développer. J'aimerais avoir des bitmaps transparents, mais pas à ce prix. –

Répondre

7

Vous venez de créer un ColorMatrix approprié, initialiser un objet avec ImageAttributes et passer que ImageAttributes objet à une de la version surchargée de Graphics.DrawImage. Cet exemple vous donnera 50% de transparence:

float[][] matrixAlpha = 
    { 
    new float[] {1, 0, 0, 0, 0}, 
    new float[] {0, 1, 0, 0, 0}, 
    new float[] {0, 0, 1, 0, 0}, 
    new float[] {0, 0, 0, 0.5f, 0}, 
    new float[] {0, 0, 0, 0, 1} 
    }; 
    ColorMatrix colorMatrix = new ColorMatrix(matrixAlpha); 

    ImageAttributes iaAlphaBlend = new ImageAttributes(); 
    iaAlphaBlend.SetColorMatrix(
    colorMatrix, 
    ColorMatrixFlag.Default, 
    ColorAdjustType.Bitmap); 
+0

Merci Danbystrom, semble être exactement ce que je cherchais. –

Questions connexes