दिलचस्प पोस्ट
एक अन्य थ्रेड से यूनिटी एपीआई का उपयोग करें या मुख्य थ्रेड में फ़ंक्शन कॉल करें Matplotlib विभिन्न आकार subplots `चालू` और` लाइव` या `बाइंड` में अंतर क्या है? सबसे महत्वपूर्ण बिट (बाएं-सबसे) खोजें जो थोड़ी सरणी में सेट है अजगर 3 में स्थान के बिना प्रिंट करें जावास्क्रिप्ट: एचटीएमएल टेक्स्टरेआ में लाइन ब्रेक जोड़ने के लिए कैसे? ViewModelBase में कमांड करने के लिए WPF बटन को बाँध कैसे करें? 10 सेकंड के लिए पॉप-अप विलंब करें, केवल एक बार पॉप अप करें क्या यह एक पुनरावर्ती SQL क्वेरी बनाना संभव है? एक एजेक्स अनुरोध का उपयोग करके फ़ाइल डाउनलोड करें प्रारंभिक और देर से बाध्यकारी के बीच क्या अंतर है? एडीटी 22.2 नया ऐप विज़ार्ड: असमर्थित टेम्पलेट निर्भरता: अपने एंड्रॉइड एक्लिप्स प्लगइन का नवीनीकरण करें Google फॉर्म फ़ाइल अपलोड पूर्ण उदाहरण मैं jQuery के साथ छद्म तत्वों की शैली गुणों का उपयोग कैसे करूं? JSON के लिए जावास्क्रिप्ट एसोसिएटिव सरणी

WPF में काम करने के लिए मैं एनिमेटेड जीआईएफ कैसे प्राप्त करूं?

Image , MediaElement , आदि – मुझे किस नियंत्रण प्रकार का उपयोग करना चाहिए?

वेब के समाधान से एकत्रित समाधान "WPF में काम करने के लिए मैं एनिमेटेड जीआईएफ कैसे प्राप्त करूं?"

मैं इस सवाल का सबसे लोकप्रिय जवाब (ऊपर से Dario द्वारा) ठीक से काम करने के लिए नहीं मिल सका। परिणाम अजीब कलाकृतियों के साथ अजीब, अस्थिर एनीमेशन था। मैंने अभी तक सबसे अच्छा समाधान पाया है: https://github.com/XamlAnimatedGif/WpfAnimatedGif

आप इसे NuGet के साथ स्थापित कर सकते हैं

PM> Install-Package WpfAnimatedGif

और इसका उपयोग करने के लिए विंडो में एक नया नाम स्थान पर, जहां आप जीआईएफ छवि जोड़ना चाहते हैं और इसे नीचे के रूप में उपयोग करना चाहते हैं

 <Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:gif="http://wpfanimatedgif.codeplex.com" <!-- THIS NAMESPACE --> Title="MainWindow" Height="350" Width="525"> <Grid> <!-- EXAMPLE USAGE BELOW --> <Image gif:ImageBehavior.AnimatedSource="Images/animated.gif" /> 

पैकेज वास्तव में साफ है, आप नीचे की तरह कुछ विशेषताओं को सेट कर सकते हैं

  <Image gif:ImageBehavior.RepeatBehavior="3x" gif:ImageBehavior.AnimatedSource="Images/animated.gif" /> 

और आप इसे अपने कोड में भी उपयोग कर सकते हैं:

 var image = new BitmapImage(); image.BeginInit(); image.UriSource = new Uri(fileName); image.EndInit(); ImageBehavior.SetAnimatedSource(img, image); 

मैं चित्र नियंत्रण को बढ़ाकर एक समाधान पोस्ट कर रहा हूं और जीआईएफ विकोडक का उपयोग कर रहा हूं। जीआईएफ डिकोडर में एक फ़्रेम संपत्ति है। मैं FrameIndex संपत्ति चेतन। ईवेंट ChangingFrameIndex FrameIndex फ्रेम FrameIndex (जो कि डीकोडर में है) से संबंधित फ्रेम में स्रोत प्रॉपर्टी बदलता है। मुझे लगता है कि जीआईएफ 10 फ्रेम प्रति सेकंड है।

 class GifImage : Image { private bool _isInitialized; private GifBitmapDecoder _gifDecoder; private Int32Animation _animation; public int FrameIndex { get { return (int)GetValue(FrameIndexProperty); } set { SetValue(FrameIndexProperty, value); } } private void Initialize() { _gifDecoder = new GifBitmapDecoder(new Uri("pack://application:,,," + this.GifSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); _animation = new Int32Animation(0, _gifDecoder.Frames.Count - 1, new Duration(new TimeSpan(0, 0, 0, _gifDecoder.Frames.Count / 10, (int)((_gifDecoder.Frames.Count / 10.0 - _gifDecoder.Frames.Count / 10) * 1000)))); _animation.RepeatBehavior = RepeatBehavior.Forever; this.Source = _gifDecoder.Frames[0]; _isInitialized = true; } static GifImage() { VisibilityProperty.OverrideMetadata(typeof (GifImage), new FrameworkPropertyMetadata(VisibilityPropertyChanged)); } private static void VisibilityPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if ((Visibility)e.NewValue == Visibility.Visible) { ((GifImage)sender).StartAnimation(); } else { ((GifImage)sender).StopAnimation(); } } public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new UIPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex))); static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev) { var gifImage = obj as GifImage; gifImage.Source = gifImage._gifDecoder.Frames[(int)ev.NewValue]; } /// <summary> /// Defines whether the animation starts on it's own /// </summary> public bool AutoStart { get { return (bool)GetValue(AutoStartProperty); } set { SetValue(AutoStartProperty, value); } } public static readonly DependencyProperty AutoStartProperty = DependencyProperty.Register("AutoStart", typeof(bool), typeof(GifImage), new UIPropertyMetadata(false, AutoStartPropertyChanged)); private static void AutoStartPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) (sender as GifImage).StartAnimation(); } public string GifSource { get { return (string)GetValue(GifSourceProperty); } set { SetValue(GifSourceProperty, value); } } public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(string.Empty, GifSourcePropertyChanged)); private static void GifSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { (sender as GifImage).Initialize(); } /// <summary> /// Starts the animation /// </summary> public void StartAnimation() { if (!_isInitialized) this.Initialize(); BeginAnimation(FrameIndexProperty, _animation); } /// <summary> /// Stops the animation /// </summary> public void StopAnimation() { BeginAnimation(FrameIndexProperty, null); } } 

उपयोग का उदाहरण (एक्सएएमएल):

 <controls:GifImage x:Name="gifImage" Stretch="None" GifSource="/SomeImage.gif" AutoStart="True" /> 

मैंने भी एक खोज की और पुराने एमएसडीएन मंचों पर सिर्फ एक धागे में कई अलग-अलग समाधान पाया। (लिंक अब काम नहीं किया, इसलिए मैंने इसे हटा दिया)

निष्पादित करने के लिए सरलतम एक WinForms PictureBox नियंत्रण का उपयोग करने के लिए लगता है, और इस तरह चला गया (धागा से कुछ चीजें बदल दी है, इसमें से अधिकतर एक ही)

System.Windows.Forms , WindowsFormsIntegration , और System.Drawing लिए एक संदर्भ जोड़ें। सबसे पहले अपनी परियोजना को WindowsFormsIntegration

 <Window x:Class="GifExample.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:winForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" Loaded="Window_Loaded" > <Grid> <wfi:WindowsFormsHost> <winForms:PictureBox x:Name="pictureBoxLoading"> </winForms:PictureBox> </wfi:WindowsFormsHost> </Grid> </Window > 

फिर Window_Loaded हैंडलर में, आप Window_Loaded हो जाएगा। छवि चित्र पथ जिसे आप दिखाना चाहते हैं के लिए छवि स्थान स्थान।

 private void Window_Loaded(object sender, RoutedEventArgs e) { pictureBoxLoading.ImageLocation = "../Images/mygif.gif"; } 

MediaElement कंट्रोल का उल्लेख उस धागे में किया गया था, लेकिन यह भी उल्लेख किया गया है कि यह एक भारी नियंत्रण है, इसलिए Image नियंत्रण के आधार पर कम से कम 2 होमब्रेडेड नियंत्रणों सहित कई विकल्प थे, इसलिए यह आसान है।

इस छोटे ऐप के बारे में कैसे: पीछे कोड:

 public MainWindow() { InitializeComponent(); Files = Directory.GetFiles(@"I:\images"); this.DataContext= this; } public string[] Files {get;set;} 

XAML:

 <Window x:Class="PicViewer.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="175" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <ListBox x:Name="lst" ItemsSource="{Binding Path=Files}"/> <MediaElement Grid.Column="1" LoadedBehavior="Play" Source="{Binding ElementName=lst, Path=SelectedItem}" Stretch="None"/> </Grid> </Window> 

यहां एनिमेटेड छवि नियंत्रण का मेरा संस्करण है आप छवि स्रोत निर्दिष्ट करने के लिए मानक प्रॉपर्टी स्रोत का उपयोग कर सकते हैं। मैंने इसे बेहतर बनाया। मैं रूसी हूँ, परियोजना रूसी है, इसलिए रूसी में भी टिप्पणियां हैं। लेकिन वैसे भी आपको टिप्पणियों के बिना सब कुछ समझने में सक्षम होना चाहिए। 🙂

 /// <summary> /// Control the "Images", which supports animated GIF. /// </summary> public class AnimatedImage : Image { #region Public properties /// <summary> /// Gets / sets the number of the current frame. /// </summary> public int FrameIndex { get { return (int) GetValue(FrameIndexProperty); } set { SetValue(FrameIndexProperty, value); } } /// <summary> /// Gets / sets the image that will be drawn. /// </summary> public new ImageSource Source { get { return (ImageSource) GetValue(SourceProperty); } set { SetValue(SourceProperty, value); } } #endregion #region Protected interface /// <summary> /// Provides derived classes an opportunity to handle changes to the Source property. /// </summary> protected virtual void OnSourceChanged(DependencyPropertyChangedEventArgs aEventArgs) { ClearAnimation(); BitmapImage lBitmapImage = aEventArgs.NewValue as BitmapImage; if (lBitmapImage == null) { ImageSource lImageSource = aEventArgs.NewValue as ImageSource; base.Source = lImageSource; return; } if (!IsAnimatedGifImage(lBitmapImage)) { base.Source = lBitmapImage; return; } PrepareAnimation(lBitmapImage); } #endregion #region Private properties private Int32Animation Animation { get; set; } private GifBitmapDecoder Decoder { get; set; } private bool IsAnimationWorking { get; set; } #endregion #region Private methods private void ClearAnimation() { if (Animation != null) { BeginAnimation(FrameIndexProperty, null); } IsAnimationWorking = false; Animation = null; Decoder = null; } private void PrepareAnimation(BitmapImage aBitmapImage) { Debug.Assert(aBitmapImage != null); if (aBitmapImage.UriSource != null) { Decoder = new GifBitmapDecoder( aBitmapImage.UriSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); } else { aBitmapImage.StreamSource.Position = 0; Decoder = new GifBitmapDecoder( aBitmapImage.StreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); } Animation = new Int32Animation( 0, Decoder.Frames.Count - 1, new Duration( new TimeSpan( 0, 0, 0, Decoder.Frames.Count / 10, (int) ((Decoder.Frames.Count / 10.0 - Decoder.Frames.Count / 10) * 1000)))) { RepeatBehavior = RepeatBehavior.Forever }; base.Source = Decoder.Frames[0]; BeginAnimation(FrameIndexProperty, Animation); IsAnimationWorking = true; } private bool IsAnimatedGifImage(BitmapImage aBitmapImage) { Debug.Assert(aBitmapImage != null); bool lResult = false; if (aBitmapImage.UriSource != null) { BitmapDecoder lBitmapDecoder = BitmapDecoder.Create( aBitmapImage.UriSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); lResult = lBitmapDecoder is GifBitmapDecoder; } else if (aBitmapImage.StreamSource != null) { try { long lStreamPosition = aBitmapImage.StreamSource.Position; aBitmapImage.StreamSource.Position = 0; GifBitmapDecoder lBitmapDecoder = new GifBitmapDecoder( aBitmapImage.StreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); lResult = lBitmapDecoder.Frames.Count > 1; aBitmapImage.StreamSource.Position = lStreamPosition; } catch { lResult = false; } } return lResult; } private static void ChangingFrameIndex (DependencyObject aObject, DependencyPropertyChangedEventArgs aEventArgs) { AnimatedImage lAnimatedImage = aObject as AnimatedImage; if (lAnimatedImage == null || !lAnimatedImage.IsAnimationWorking) { return; } int lFrameIndex = (int) aEventArgs.NewValue; ((Image) lAnimatedImage).Source = lAnimatedImage.Decoder.Frames[lFrameIndex]; lAnimatedImage.InvalidateVisual(); } /// <summary> /// Handles changes to the Source property. /// </summary> private static void OnSourceChanged (DependencyObject aObject, DependencyPropertyChangedEventArgs aEventArgs) { ((AnimatedImage) aObject).OnSourceChanged(aEventArgs); } #endregion #region Dependency Properties /// <summary> /// FrameIndex Dependency Property /// </summary> public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register( "FrameIndex", typeof (int), typeof (AnimatedImage), new UIPropertyMetadata(0, ChangingFrameIndex)); /// <summary> /// Source Dependency Property /// </summary> public new static readonly DependencyProperty SourceProperty = DependencyProperty.Register( "Source", typeof (ImageSource), typeof (AnimatedImage), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure, OnSourceChanged)); #endregion } 

यदि आप <MediaElement> उपयोग करते हैं तो यह बहुत आसान है:

 <MediaElement Height="113" HorizontalAlignment="Left" Margin="12,12,0,0" Name="mediaElement1" VerticalAlignment="Top" Width="198" Source="C:\Users\abc.gif" LoadedBehavior="Play" Stretch="Fill" SpeedRatio="1" IsMuted="False" /> 

मैं इस पुस्तकालय का उपयोग करता हूं: http://wpfanimatedgif.codeplex.com/

सबसे पहले, अपनी प्रोजेक्ट (पैकेज प्रबंधक कंसोल का उपयोग करके) को लाइब्रेरी स्थापित करें:

  PM > Install-Package WpfAnimatedGif 

फिर, इस स्निपेट को एक्सएएमएल फ़ाइल में उपयोग करें:

  <Window x:Class="WpfAnimatedGif.Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:gif="http://wpfanimatedgif.codeplex.com" Title="MainWindow" Height="350" Width="525"> <Grid> <Image gif:ImageBehavior.AnimatedSource="Images/animated.gif" /> ... 

मुझे आशा है कि मदद करता है

स्रोत: http://wpfanimatedgif.codeplex.com/

असल में ऊपर एक ही चित्र बॉक्स समाधान, लेकिन इस बार कोड-पीछे के साथ अपने प्रोजेक्ट में एक एम्बेडेड संसाधन का उपयोग करें:

एक्सएएमएल में:

 <WindowsFormsHost x:Name="_loadingHost"> <Forms:PictureBox x:Name="_loadingPictureBox"/> </WindowsFormsHost> 

कोड-पीछे में:

 public partial class ProgressIcon { public ProgressIcon() { InitializeComponent(); var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("My.Namespace.ProgressIcon.gif"); var image = System.Drawing.Image.FromStream(stream); Loaded += (s, e) => _loadingPictureBox.Image = image; } } 

मैंने माइक ईश्वा के कोड को संशोधित किया, और मैंने इसे बेहतर काम किया। आप इसे 1 फ्रेम की जेपीजी पीएनजी बीएमपी या एमटीआईएल फ्रेम के साथ इस्तेमाल कर सकते हैं। यदि आप नियंत्रण के लिए एक यूरी बाँध चाहते हैं, तो UriSource गुणों को बाध्य करें या आप किसी भी इन- मेमोरी स्ट्रीम जिसे आप सोर्स अटॉवीसी को बाँध लें जो एक बिटमैप इमेज है।

  /// <summary> /// Элемент управления "Изображения", поддерживающий анимированные GIF. /// </summary> public class AnimatedImage : Image { static AnimatedImage() { DefaultStyleKeyProperty.OverrideMetadata(typeof(AnimatedImage), new FrameworkPropertyMetadata(typeof(AnimatedImage))); } #region Public properties /// <summary> /// Получает/устанавливает номер текущего кадра. /// </summary> public int FrameIndex { get { return (int)GetValue(FrameIndexProperty); } set { SetValue(FrameIndexProperty, value); } } /// <summary> /// Get the BitmapFrame List. /// </summary> public List<BitmapFrame> Frames { get; private set; } /// <summary> /// Get or set the repeatBehavior of the animation when source is gif formart.This is a dependency object. /// </summary> public RepeatBehavior AnimationRepeatBehavior { get { return (RepeatBehavior)GetValue(AnimationRepeatBehaviorProperty); } set { SetValue(AnimationRepeatBehaviorProperty, value); } } public new BitmapImage Source { get { return (BitmapImage)GetValue(SourceProperty); } set { SetValue(SourceProperty, value); } } public Uri UriSource { get { return (Uri)GetValue(UriSourceProperty); } set { SetValue(UriSourceProperty, value); } } #endregion #region Protected interface /// <summary> /// Provides derived classes an opportunity to handle changes to the Source property. /// </summary> protected virtual void OnSourceChanged(DependencyPropertyChangedEventArgs e) { ClearAnimation(); BitmapImage source; if (e.NewValue is Uri) { source = new BitmapImage(); source.BeginInit(); source.UriSource = e.NewValue as Uri; source.CacheOption = BitmapCacheOption.OnLoad; source.EndInit(); } else if (e.NewValue is BitmapImage) { source = e.NewValue as BitmapImage; } else { return; } BitmapDecoder decoder; if (source.StreamSource != null) { decoder = BitmapDecoder.Create(source.StreamSource, BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnLoad); } else if (source.UriSource != null) { decoder = BitmapDecoder.Create(source.UriSource, BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnLoad); } else { return; } if (decoder.Frames.Count == 1) { base.Source = decoder.Frames[0]; return; } this.Frames = decoder.Frames.ToList(); PrepareAnimation(); } #endregion #region Private properties private Int32Animation Animation { get; set; } private bool IsAnimationWorking { get; set; } #endregion #region Private methods private void ClearAnimation() { if (Animation != null) { BeginAnimation(FrameIndexProperty, null); } IsAnimationWorking = false; Animation = null; this.Frames = null; } private void PrepareAnimation() { Animation = new Int32Animation( 0, this.Frames.Count - 1, new Duration( new TimeSpan( 0, 0, 0, this.Frames.Count / 10, (int)((this.Frames.Count / 10.0 - this.Frames.Count / 10) * 1000)))) { RepeatBehavior = RepeatBehavior.Forever }; base.Source = this.Frames[0]; BeginAnimation(FrameIndexProperty, Animation); IsAnimationWorking = true; } private static void ChangingFrameIndex (DependencyObject dp, DependencyPropertyChangedEventArgs e) { AnimatedImage animatedImage = dp as AnimatedImage; if (animatedImage == null || !animatedImage.IsAnimationWorking) { return; } int frameIndex = (int)e.NewValue; ((Image)animatedImage).Source = animatedImage.Frames[frameIndex]; animatedImage.InvalidateVisual(); } /// <summary> /// Handles changes to the Source property. /// </summary> private static void OnSourceChanged (DependencyObject dp, DependencyPropertyChangedEventArgs e) { ((AnimatedImage)dp).OnSourceChanged(e); } #endregion #region Dependency Properties /// <summary> /// FrameIndex Dependency Property /// </summary> public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register( "FrameIndex", typeof(int), typeof(AnimatedImage), new UIPropertyMetadata(0, ChangingFrameIndex)); /// <summary> /// Source Dependency Property /// </summary> public new static readonly DependencyProperty SourceProperty = DependencyProperty.Register( "Source", typeof(BitmapImage), typeof(AnimatedImage), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure, OnSourceChanged)); /// <summary> /// AnimationRepeatBehavior Dependency Property /// </summary> public static readonly DependencyProperty AnimationRepeatBehaviorProperty = DependencyProperty.Register( "AnimationRepeatBehavior", typeof(RepeatBehavior), typeof(AnimatedImage), new PropertyMetadata(null)); public static readonly DependencyProperty UriSourceProperty = DependencyProperty.Register( "UriSource", typeof(Uri), typeof(AnimatedImage), new FrameworkPropertyMetadata( null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure, OnSourceChanged)); #endregion } 

यह एक कस्टम नियंत्रण है। आपको इसे WPF ऐप प्रोजेक्ट में बनाने और शैली में टेम्पलेट ओवरराइड को हटाने की आवश्यकता है।

मुझे यह समस्या थी, जब तक कि मुझे पता चला कि WPF4 में, आप अपनी खुद की कीफ़्रेम छवि एनिमेशन अनुकरण कर सकते हैं। सबसे पहले, अपनी एनीमेशन को छवियों की श्रृंखला में विभाजित करें, उन्हें "छवि 1 जीआईएफ", "इमेज 2, जीआईएफ" और इसी तरह से कुछ शीर्षक दें। उन चित्रों को अपने समाधान संसाधनों में आयात करें मैं मान रहा हूँ कि आप उन्हें छवियों के लिए डिफ़ॉल्ट संसाधन स्थान में डाल दिया है।

आप छवि नियंत्रण का उपयोग करने जा रहे हैं। निम्न XAML कोड का उपयोग करें मैंने गैर-अनिवार्यताओं को निकाल दिया है

 <Image Name="Image1"> <Image.Triggers> <EventTrigger RoutedEvent="Image.Loaded" <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <ObjectAnimationUsingKeyFrames Duration="0:0:1" Storyboard.TargetProperty="Source" RepeatBehavior="Forever"> <DiscreteObjectKeyFrames KeyTime="0:0:0"> <DiscreteObjectKeyFrame.Value> <BitmapImage UriSource="Images/Image1.gif"/> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrames> <DiscreteObjectKeyFrames KeyTime="0:0:0.25"> <DiscreteObjectKeyFrame.Value> <BitmapImage UriSource="Images/Image2.gif"/> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrames> <DiscreteObjectKeyFrames KeyTime="0:0:0.5"> <DiscreteObjectKeyFrame.Value> <BitmapImage UriSource="Images/Image3.gif"/> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrames> <DiscreteObjectKeyFrames KeyTime="0:0:0.75"> <DiscreteObjectKeyFrame.Value> <BitmapImage UriSource="Images/Image4.gif"/> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrames> <DiscreteObjectKeyFrames KeyTime="0:0:1"> <DiscreteObjectKeyFrame.Value> <BitmapImage UriSource="Images/Image5.gif"/> </DiscreteObjectKeyFrame.Value> </DiscreteObjectKeyFrames> </ObjectAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </Image.Triggers> </Image> 

आपके पोस्ट जोएल के लिए धन्यवाद, यह मुझे एनीमेटेड जीआईएफ के लिए WPF की सहायता की अनुपस्थिति को हल करने में मदद मिली I बस थोड़ी सी कोड जोड़ना क्योंकि मेरे पास तस्वीरबॉक्लोडिंग के साथ समय की एक झलक थी। Winforms api के कारण छवि संपत्ति

मुझे अपने एनिमेटेड जीआईएफ छवि की बिल्ड एक्शन को "कंटेंट" और प्रतिलिपि आउटपुट डायरेक्टरी के रूप में "नया कॉपी करें" या "हमेशा" के रूप में सेट करना था। तब मुख्य विंडो में () मैंने इस विधि को बुलाया। केवल मुद्दा यह है कि जब मैंने धारा के निपटान की कोशिश की तो उसने मुझे अपनी छवि के बदले एक लाल लिफाफा ग्राफिक दिया। मुझे उस समस्या को हल करना होगा इससे एक बिटमैप इमेज लोड करने और इसे बिटमैप में बदलने का दर्द हटा दिया गया (जो स्पष्ट रूप से मेरी एनीमेशन को मार डाला क्योंकि यह अब जीआईएफ नहीं है)।

 private void SetupProgressIcon() { Uri uri = new Uri("pack://application:,,,/WPFTest;component/Images/animated_progress_apple.gif"); if (uri != null) { Stream stream = Application.GetContentStream(uri).Stream; imgProgressBox.Image = new System.Drawing.Bitmap(stream); } } 

मैं ऊपर सभी तरह की कोशिश की है, लेकिन हर कोई अपनी कमी है, और आप सभी के लिए धन्यवाद, मैं अपना खुद का GifImage काम:

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Controls; using System.Windows; using System.Windows.Media.Imaging; using System.IO; using System.Windows.Threading; namespace IEXM.Components { public class GifImage : Image { #region gif Source, such as "/IEXM;component/Images/Expression/f020.gif" public string GifSource { get { return (string)GetValue(GifSourceProperty); } set { SetValue(GifSourceProperty, value); } } public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(null, GifSourcePropertyChanged)); private static void GifSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { (sender as GifImage).Initialize(); } #endregion #region control the animate /// <summary> /// Defines whether the animation starts on it's own /// </summary> public bool IsAutoStart { get { return (bool)GetValue(AutoStartProperty); } set { SetValue(AutoStartProperty, value); } } public static readonly DependencyProperty AutoStartProperty = DependencyProperty.Register("IsAutoStart", typeof(bool), typeof(GifImage), new UIPropertyMetadata(false, AutoStartPropertyChanged)); private static void AutoStartPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) (sender as GifImage).StartAnimation(); else (sender as GifImage).StopAnimation(); } #endregion private bool _isInitialized = false; private System.Drawing.Bitmap _bitmap; private BitmapSource _source; [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern bool DeleteObject(IntPtr hObject); private BitmapSource GetSource() { if (_bitmap == null) { _bitmap = new System.Drawing.Bitmap(Application.GetResourceStream( new Uri(GifSource, UriKind.RelativeOrAbsolute)).Stream); } IntPtr handle = IntPtr.Zero; handle = _bitmap.GetHbitmap(); BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); DeleteObject(handle); return bs; } private void Initialize() { // Console.WriteLine("Init: " + GifSource); if (GifSource != null) Source = GetSource(); _isInitialized = true; } private void FrameUpdatedCallback() { System.Drawing.ImageAnimator.UpdateFrames(); if (_source != null) { _source.Freeze(); } _source = GetSource(); // Console.WriteLine("Working: " + GifSource); Source = _source; InvalidateVisual(); } private void OnFrameChanged(object sender, EventArgs e) { Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(FrameUpdatedCallback)); } /// <summary> /// Starts the animation /// </summary> public void StartAnimation() { if (!_isInitialized) this.Initialize(); // Console.WriteLine("Start: " + GifSource); System.Drawing.ImageAnimator.Animate(_bitmap, OnFrameChanged); } /// <summary> /// Stops the animation /// </summary> public void StopAnimation() { _isInitialized = false; if (_bitmap != null) { System.Drawing.ImageAnimator.StopAnimate(_bitmap, OnFrameChanged); _bitmap.Dispose(); _bitmap = null; } _source = null; Initialize(); GC.Collect(); GC.WaitForFullGCComplete(); // Console.WriteLine("Stop: " + GifSource); } public void Dispose() { _isInitialized = false; if (_bitmap != null) { System.Drawing.ImageAnimator.StopAnimate(_bitmap, OnFrameChanged); _bitmap.Dispose(); _bitmap = null; } _source = null; GC.Collect(); GC.WaitForFullGCComplete(); // Console.WriteLine("Dispose: " + GifSource); } } } 

उपयोग:

 <localComponents:GifImage x:Name="gifImage" IsAutoStart="True" GifSource="{Binding Path=value}" /> 

चूंकि यह मेमोरी रिसाव का कारण नहीं होगा और यह जीआईएफ इमेज की अपनी टाइम लाइन एनिमेटेड है, आप इसे कोशिश कर सकते हैं।

पहले, मुझे एक ऐसी ही समस्या का सामना करना पड़ा, मुझे आपके प्रोजेक्ट में .gif फ़ाइल चलाने की आवश्यकता थी। मुझे दो विकल्प थे:

  • WinForms से पिक्चरबॉक्स का उपयोग कर

  • एक तृतीय-पक्ष पुस्तकालय का उपयोग करते हुए, जैसे WPFAnimatedGif, codeplex.com से।

PictureBox साथ संस्करण मेरे लिए काम नहीं किया, और परियोजना इसके लिए बाहरी पुस्तकालयों का उपयोग नहीं कर सका। इसलिए मैंने इसे Bitmap माध्यम से मदद के लिए ImageAnimator साथ ImageAnimator । क्योंकि, मानक BitmapImage .gif फ़ाइलों का प्लेबैक का समर्थन नहीं करता है।

पूर्ण उदाहरण:

XAML

 <Window x:Class="PlayGifHelp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded"> <Grid> <Image x:Name="SampleImage" /> </Grid> </Window> 

Code behind

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } Bitmap _bitmap; BitmapSource _source; private BitmapSource GetSource() { if (_bitmap == null) { string path = Directory.GetCurrentDirectory(); // Check the path to the .gif file _bitmap = new Bitmap(path + @"\anim.gif"); } IntPtr handle = IntPtr.Zero; handle = _bitmap.GetHbitmap(); return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { _source = GetSource(); SampleImage.Source = _source; ImageAnimator.Animate(_bitmap, OnFrameChanged); } private void FrameUpdatedCallback() { ImageAnimator.UpdateFrames(); if (_source != null) { _source.Freeze(); } _source = GetSource(); SampleImage.Source = _source; InvalidateVisual(); } private void OnFrameChanged(object sender, EventArgs e) { Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(FrameUpdatedCallback)); } } 

Bitmap does not support URI directive, so I load .gif file from the current directory.

Small improvement of GifImage.Initialize() method, which reads proper frame timing from GIF metadata.

  private void Initialize() { _gifDecoder = new GifBitmapDecoder(new Uri("pack://application:,,," + this.GifSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); int duration=0; _animation = new Int32AnimationUsingKeyFrames(); _animation.KeyFrames.Add(new DiscreteInt32KeyFrame(0, KeyTime.FromTimeSpan(new TimeSpan(0)))); foreach (BitmapFrame frame in _gifDecoder.Frames) { BitmapMetadata btmd = (BitmapMetadata)frame.Metadata; duration += (ushort)btmd.GetQuery("/grctlext/Delay"); _animation.KeyFrames.Add(new DiscreteInt32KeyFrame(_gifDecoder.Frames.IndexOf(frame)+1, KeyTime.FromTimeSpan(new TimeSpan(duration*100000)))); } _animation.RepeatBehavior = RepeatBehavior.Forever; this.Source = _gifDecoder.Frames[0]; _isInitialized = true; } 

I am not sure if this has been solved but the best way is to use the WpfAnimatedGid library . It is very easy, simple and straight forward to use. It only requires 2lines of XAML code and about 5 lines of C# Code in the code behind.

You will see all the necessary details of how this can be used there. This is what I also used instead of re-inventing the wheel