2011-11-14 2 views
3

Est-ce que WPF a un équivalent?Définition de la transparence d'un WPF ImageSource (équivalent à GDI Matrix33 = 0.5f)?

ImageAttributes ia = new ImageAttributes(); 
ia.SetColorMatrix(new ColorMatrix { Matrix33 = 0.5f }, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 

En d'autres termes, je peux ajuster la transparence d'un WPF ImageSource (ou toute autre classe liée dessin par exemple BitmapImage), ou est GDI le meilleur choix ici?

Je ne veux pas attirer l'image sur une fenêtre, donc je pense que les règles à l'aide de la classe Image (?)

(Ma ligne de pensée à essayer d'utiliser à la place WPF de GDI est principalement parce que J'ai l'impression qu'avec WPF je peux avoir une accélération matérielle, mais d'après ce que j'ai vu jusqu'ici, il semble que cela ne s'applique qu'à un très petit sous-ensemble de manipulation d'image)

Répondre

0

Suite à vos commentaires, j'ai créé un exemple de projet qui peut modifier l'alpha canal rapidement en utilisant WriteableBitmapEx comme base et téléchargé sur mon Company Blog. Vous devrez pardonner le formatage, c'est un nouveau site web et il y a encore quelques problèmes à résoudre! Le lien de téléchargement est sur la page intitulée BitmapAlphaChannel

Vous avez raison de dire que l'accélération matérielle de WPF est seulement appliquée à un sous-ensemble limité de fonctionnalités. Par exemple, toute la mise en page est faite sur le CPU, la tessellation sur le CPU, seul le rendu final est fait sur le GPU. Le résultat est WPF dans mon expérience est plus lent que GDI +, certainement GDI. Cependant, il peut être poussé dans la bonne direction pour faire ce que vous voulez, à la vitesse que vous voulez!

+0

Semble fonctionner très bien, acclamations :) – unrelativity

+1

Lien est mort :( –

+0

Désolé, ce site n'existe plus.Je suggère de regarder les échantillons http://writeablebitmapex.codeplex.com/ à la place. –

0

Une image a un champ opacity , qui est une valeur comprise entre 1.0 (complètement opaque) et 0.0 (invisible)

Par exemple:

<Image 
Height="107" 
Margin="367,0,473,83" 
Source="Images/4.png" 
Stretch="Fill" 
    VerticalAlignment="Bottom" Opacity="0.5"/> 
+0

Mais n'est-ce pas la seule façon de ramener cette image dans quelque chose que je peux, par exemple, enregistrer, est à travers quelque chose comme un RenderTargetBitmap? Cela n'entraînerait-il pas une perte d'opacité? – unrelativity

2

extraire , qui fournit un ensemble de méthodes d'extension pour manipuler des bitmaps en mémoire avec WPF et Silverlight.

Il n'y a rien dans WPF en soi qui vous permettra de faire, mais la classe WPF/Silverlight WriteableBitmap fournit une API rapide, de bas niveau à dessiner/manipuler et est native à WPF.

WriteableBitmapEx puis s'appuie sur cela en fournissant des méthodes d'extension pour effectuer des opérations de type GDI. Il y a une fonction Convolute qui permet de convolution d'une image avec une matrice, donc vous pouvez faire ce qui précède. Remarque WB-Ex est une bibliothèque Silverlight mais fournit également une version WPF non maintenue qui, bien qu'incomplète, peut être étendue pour rester à jour avec la version Silverlight.

À part cela, je suggérerais de rouler le vôtre. Si tout ce que vous voulez faire est de modifier l'opacité à 0.5f alors plutôt que de convoluer je suggérerais d'écrire une fonction spécifique pour faire cela sur la base des exemples ci-dessus

+0

Je ne pouvais pas comprendre comment porter une méthode à WPF à partir de ces méthodes convolute, donc j'ai donné la méthode 'ForEach' un aller de [ici] (http://writeablebitmapex.codeplex.com/SourceControl/changeset/view/82092 # 1765208), et l'a trouvé beaucoup plus lent que l'utilisation de GDI - et cette méthode utilise aussi du code dangereux! J'essaie de voir si je peux utiliser WPF pour de telles opérations car il y a une accélération matérielle, mais maintenant il semble que ça ne s'applique qu'à des choses comme les Visuals ... s'il n'y a pas de meilleures alternatives, je devrais utiliser GDI . – unrelativity

+0

Je ne sais pas, j'ai eu WriteableBitmapEx faire quelques opérations assez rapides.Qu'est-ce que tu essayais exactement? Soyez avisé que beaucoup des extensions ont un Bitmap.Lock() avant et après, ce qui est une opération lente. En prenant le code dans cette bibliothèque comme point de départ, avez-vous envisagé d'itérer sur les pixels (à partir d'un pointeur non sécurisé) par étapes de 4 et de modifier le résultat? La raison étant une image au format BGRA aura tous les quatrièmes octets égal à un octet de canal alpha. Cela pourrait être très rapide. –