2009-11-10 9 views
1

J'ai un Image clipsage comme ceci:WPF - Comment appliquer un effet à une image recadrée?

<Image Width="45" Grid.Column="0" Source="{Binding Photo}"> 
    <Image.Clip> 
     <RectangleGeometry Rect="0,0,45,55" RadiusX="8" RadiusY="8" /> 
    </Image.Clip> 
</Image> 

Comment puis-je appliquer un effet d'ombre portée à elle?

MISE À JOUR:
Comme l'a souligné Ray, la meilleure solution est celle proposée par Anderson - ayant une frontière d'emballage. Merci Anderson.

Répondre

2

Cela devrait fonctionner

<Image Width="45" Grid.Column="0" Source="{Binding Photo}" 
    <Image.Clip> 
     <RectangleGeometry Rect="0,0,45,55" RadiusX="8" RadiusY="8" /> 
    </Image.Clip> 
    <Image.Effect> 
     <DropShadowEffect Color="Black" BlurRadius="20" /> 
    </Image.Effect> 
</Image> 

Je n'ai pas essayé en combinaison avec clip, cependant.

Mise à jour: Cela ne fonctionne pas (semble comme un bug?)

Je venais de le faire:

<Border Grid.Column="0" > 
    <Border.Effect> 
      <DropShadowEffect /> 
    </Border.Effect> 
    <Image Width="45" Source="{Binding Photo}" 
     <Image.Clip> 
      <RectangleGeometry Rect="0,0,45,55" RadiusX="8" RadiusY="8" /> 
     </Image.Clip> 
    </Image> 
</Border> 

Bit boiteux et vous pourriez avoir à modifier quelques-unes des largeurs pour faire Bien sûr, ils correspondent exactement, mais vous avez l'idée.

+0

Merci Anderson, mais cela ne fonctionne pas parce que je suis l'écrêtage de l'image, et l'ombre portée n'est pas inclus dans le clip. –

+0

C'est très fascinant. On dirait un oubli. Je vais mettre à jour. –

+0

Anderson, il est logique que cela ne fonctionne pas comme vous l'avez suggéré. Supposons que vous ayez une image de 100x100 et que vous ayez un clip de 50x50. L'effet sera autour de l'image 100x100 et puisque vous coupez une plus petite place à l'intérieur de l'image, il ne sera pas le flou. Réalisez que le clip ne redimensionne pas l'image du tout. –

0

Je suppose que la réponse est que je dois utiliser CroppedBitmap au lieu de Image.Clip:

<Image Width="45"> 
    <Image.Source> 
     <CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/> 
    </Image.Source> 
    <Image.Effect> 
     <DropShadowEffect/> 
    </Image.Effect> 
</Image> 

et si je besoin des coins arrondis je peux entourer l'image extérieure avec une bordure et d'utiliser un ImageBrush:

<Border Width="45" Height="55" CornerRadius="10" > 
    <Border.Background> 
     <ImageBrush> 
      <ImageBrush.ImageSource> 
       <CroppedBitmap Source="profile.jpg" SourceRect="0 0 45 55"/> 
      </ImageBrush.ImageSource> 
     </ImageBrush>  
    </Border.Background> 
</Border> 

Corrigez-moi si je me trompe ou si vous pouvez le faire d'une manière plus simple. Merci!

MISE À JOUR: Apparemment, vous ne pouvez pas vous lier à la propriété Source de CroppedBitmap!

+0

Pour être plus précis, vous ne pouvez pas accéder à DataContext lors de la liaison à la propriété Source de CroppedBitmap. Les liaisons locales et les liaisons à des objets source spécifiques (Source =) sont toujours possibles, mais pas utiles dans ce cas. La raison pour laquelle vous ne pouvez pas utiliser DataContext ou FindAncestor est que CroppedBitmap n'a pas de propriété DataContext ou le concept de LogicalParent. FYI. –

+0

Note: Mon commentaire n'était pas destiné à répondre à la question initiale, mais simplement à démystifier le comportement que vous avez rencontré et à clarifier un malentendu. –

+0

Ray, pouvez-vous s'il vous plaît répondre à ma question sur ce problème ici? http://stackoverflow.com/questions/1711151/wpf-using-croppedbitmap-in-datatemplate Merci! –

3

Cela fera l'affaire pour vous:

<Border> 
    <Border.Effect> 
    <DropShadowEffect /> 
    </Border.Effect> 
    <Image Stretch="None" Source="{Binding Photo}" > 
    <Image.Clip> 
     <RectangleGeometry Rect="0,0,45,55" RadiusX="8" RadiusY="8"/> 
    </Image.Clip> 
    </Image> 
</Border> 

Ce qui bien sûr est votre idée originale, seulement avec le DropShadowEffect appliqué à une frontière d'emballage. En raison de la façon dont les effets bitmap fonctionnent, ils s'appliquent uniquement à la partie visible de ce qui est contenu.

+0

Merci Ray. J'ai vérifié et cela fonctionne. Je dois donner crédit à Anderson. –

+0

Oui, je vois que ma réponse était identique à sa réponse éditée à l'exception de Stretch = "None", ce qui fait que l'image a automatiquement la bonne taille sans avoir à coder en dur la largeur. –