获取 GIF 在 WPF 中播放(使用 GifImage 类)

发布于 2024-10-31 01:42:23 字数 1796 浏览 2 评论 0原文

以下是我在这里找到的一段代码: 如何获取可使用的动画 gif WPF?

class GifImage : Image {

    public int FrameIndex {
        get { return (int)GetValue(FrameIndexProperty); }
        set { SetValue(FrameIndexProperty, value); }
    }

    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) {
        GifImage ob = obj as GifImage;
        ob.Source = ob.gf.Frames[(int)ev.NewValue];
        ob.InvalidateVisual();
    }
    GifBitmapDecoder gf;
    Int32Animation anim ;            
    public GifImage(Uri uri) {
        gf = new GifBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        anim = new Int32Animation(0, gf.Frames.Count - 1, new Duration(new TimeSpan(0,0, 0,gf.Frames.Count/10,(int)((gf.Frames.Count/10.0-gf.Frames.Count/10)*1000))));
        anim.RepeatBehavior = RepeatBehavior.Forever;
        Source = gf.Frames[0];
    }
    bool animationIsWorking = false;
    protected override void OnRender(DrawingContext dc) {
        base.OnRender(dc);
        if (!animationIsWorking) {
            BeginAnimation(FrameIndexProperty, anim);
            animationIsWorking = true;
        }
    }
}

它应该允许我使用 GifImage 作为控件。但是

  1. 如何在 XAML 中使用它呢?
  2. 如何设置来源?我尝试了各种组合但不起作用并且没有文档:

GifImage gifImg = 新 GifImage(新 Uri(“/application;component/Images/indicator.gif”);

不起作用,异常告诉我一条错误的路径,但我就是找不到正确的路径。帮助..

Following is a piece of code I found here:
How do I get an animated gif to work in WPF?

class GifImage : Image {

    public int FrameIndex {
        get { return (int)GetValue(FrameIndexProperty); }
        set { SetValue(FrameIndexProperty, value); }
    }

    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) {
        GifImage ob = obj as GifImage;
        ob.Source = ob.gf.Frames[(int)ev.NewValue];
        ob.InvalidateVisual();
    }
    GifBitmapDecoder gf;
    Int32Animation anim ;            
    public GifImage(Uri uri) {
        gf = new GifBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        anim = new Int32Animation(0, gf.Frames.Count - 1, new Duration(new TimeSpan(0,0, 0,gf.Frames.Count/10,(int)((gf.Frames.Count/10.0-gf.Frames.Count/10)*1000))));
        anim.RepeatBehavior = RepeatBehavior.Forever;
        Source = gf.Frames[0];
    }
    bool animationIsWorking = false;
    protected override void OnRender(DrawingContext dc) {
        base.OnRender(dc);
        if (!animationIsWorking) {
            BeginAnimation(FrameIndexProperty, anim);
            animationIsWorking = true;
        }
    }
}

It supposed to allow me to use GifImage as a Control. But

  1. How do I use it in XAML?
  2. How do I set the Source? I tried various combination but doesn't work and there's no documentation:

GifImage gifImg = new GifImage(new
Uri("/application;component/Images/indicator.gif");

doesn't work and exception tells me a wrong path but I just can't get the right path. Help..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

舟遥客 2024-11-07 01:42:23

我对上面的代码做了一些修改,似乎可以工作。

Xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <local:GifImage GifSource="c:\data\test.gif" />
    </Grid>
</Window>

代码:

using System;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Media.Animation;


namespace WpfApplication1
{
    public class GifImage : Image
    {
        private GifBitmapDecoder _decoder;
        private Int32Animation _animation;

        #region FrameIndex

        public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new UIPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex)));

        public int FrameIndex
        {
            get { return (int)GetValue(FrameIndexProperty); }
            set { SetValue(FrameIndexProperty, value); }
        }

        private static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImage gifImage = obj as GifImage;
            gifImage.ChangeFrameIndex((int)ev.NewValue);
        }

        private void ChangeFrameIndex(int index)
        {
            Source = _decoder.Frames[index];
        }

        #endregion

        #region GifSource

        public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(String.Empty, new PropertyChangedCallback(GifSourceChanged)));
        public string GifSource
        {
            get { return (string)GetValue(GifSourceProperty); }
            set { SetValue(GifSourceProperty, value); }
        }

        private static void GifSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImage gifImage = obj as GifImage;
            gifImage.GifSourceChanged(ev.NewValue.ToString());
        }

        private void GifSourceChanged(string newSource)
        {
            if (_animation != null)
                BeginAnimation(FrameIndexProperty, null);

            _decoder = new GifBitmapDecoder(new Uri(newSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            Source = _decoder.Frames[0];

            int count = _decoder.Frames.Count;
            _animation = new Int32Animation(0, count - 1, new Duration(new TimeSpan(0, 0, 0, count / 10, (int)((count / 10.0 - count / 10) * 1000))));
            _animation.RepeatBehavior = RepeatBehavior.Forever;
            BeginAnimation(FrameIndexProperty, _animation);
        }

        #endregion
    }
}

I modified the above code a little and it seems to work.

Xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <local:GifImage GifSource="c:\data\test.gif" />
    </Grid>
</Window>

Code:

using System;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Media.Animation;


namespace WpfApplication1
{
    public class GifImage : Image
    {
        private GifBitmapDecoder _decoder;
        private Int32Animation _animation;

        #region FrameIndex

        public static readonly DependencyProperty FrameIndexProperty = DependencyProperty.Register("FrameIndex", typeof(int), typeof(GifImage), new UIPropertyMetadata(0, new PropertyChangedCallback(ChangingFrameIndex)));

        public int FrameIndex
        {
            get { return (int)GetValue(FrameIndexProperty); }
            set { SetValue(FrameIndexProperty, value); }
        }

        private static void ChangingFrameIndex(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImage gifImage = obj as GifImage;
            gifImage.ChangeFrameIndex((int)ev.NewValue);
        }

        private void ChangeFrameIndex(int index)
        {
            Source = _decoder.Frames[index];
        }

        #endregion

        #region GifSource

        public static readonly DependencyProperty GifSourceProperty = DependencyProperty.Register("GifSource", typeof(string), typeof(GifImage), new UIPropertyMetadata(String.Empty, new PropertyChangedCallback(GifSourceChanged)));
        public string GifSource
        {
            get { return (string)GetValue(GifSourceProperty); }
            set { SetValue(GifSourceProperty, value); }
        }

        private static void GifSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs ev)
        {
            GifImage gifImage = obj as GifImage;
            gifImage.GifSourceChanged(ev.NewValue.ToString());
        }

        private void GifSourceChanged(string newSource)
        {
            if (_animation != null)
                BeginAnimation(FrameIndexProperty, null);

            _decoder = new GifBitmapDecoder(new Uri(newSource), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
            Source = _decoder.Frames[0];

            int count = _decoder.Frames.Count;
            _animation = new Int32Animation(0, count - 1, new Duration(new TimeSpan(0, 0, 0, count / 10, (int)((count / 10.0 - count / 10) * 1000))));
            _animation.RepeatBehavior = RepeatBehavior.Forever;
            BeginAnimation(FrameIndexProperty, _animation);
        }

        #endregion
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文