private void DecodeProc(object param)
            {
                DecodeProcParams request = (DecodeProcParams)param;
                List <FrameData> frames  = new List <FrameData>();
                int width  = 0;
                int height = 0;

                GifStream gifStream = new GifStream(request.filePath);
                int       readFrame = 0;

                while (gifStream.HasMoreData)
                {
                    if (readFrame >= request.frameToRead && request.frameToRead > 0)
                    {
                        break;
                    }
                    switch (gifStream.CurrentToken)
                    {
                    case GifStream.Token.Image:
                        var image = gifStream.ReadImage();
                        width  = gifStream.Header.width;
                        height = gifStream.Header.height;
                        Color32[] copiedColors = new Color32[image.colors.Length];
                        image.colors.CopyTo(copiedColors, 0);
                        frames.Add(new FrameData()
                        {
                            colors = copiedColors,
                            delay  = image.DelaySeconds
                        });
                        readFrame++;
                        break;

                    default:
                        gifStream.SkipToken();
                        break;
                    }
                }
                gifStream.Dispose();

                request.runner.RunInMainThread(() =>
                {
                    Texture2D[] textures = new Texture2D[frames.Count];
                    int fps         = 2;
                    float totalTime = 0;
                    for (int i = 0; i < frames.Count; i++)
                    {
                        textures[i]      = new Texture2D(width, height, TextureFormat.ARGB32, false, false);
                        textures[i].name = i.ToString();
                        textures[i].SetPixels32(frames[i].colors);
                        textures[i].Apply();
                        totalTime += frames[i].delay;
                        fps        = Mathf.RoundToInt(frames.Count / totalTime);
                    }
                    animatedClip = new AnimatedClip(width, height, fps, textures);
                    IsCompleted  = true;
                    request.runner.DestroySelf();
                });
            }
Beispiel #2
0
    // Decode gif file to textures frame list
    private void DecodeGif(byte[] bytes)
    {
        var ms = new MemoryStream(bytes);

        frames      = new List <Texture>();
        frameDelays = new List <float>();

        // To stop playing previous gif
        index = 0;

        using (var gifStream = new GifStream(ms))
        {
            while (gifStream.HasMoreData)
            {
                switch (gifStream.CurrentToken)
                {
                case GifStream.Token.Image:
                    // var image = gifStream.ReadImage();
                    // do something with image
                    // This code is copy from Unitylist
                    var image = gifStream.ReadImage();
                    var frame = new Texture2D(
                        gifStream.Header.width,
                        gifStream.Header.height,
                        TextureFormat.ARGB32, false);

                    frame.SetPixels32(image.colors);
                    frame.Apply();

                    frames.Add(frame);
                    frameDelays.Add(image.SafeDelaySeconds);     // More about SafeDelay below

                    break;

                case GifStream.Token.Comment:
                    var comment = gifStream.ReadComment();
                    // log this comment
                    break;

                default:
                    gifStream.SkipToken();
                    // this token has no use for you, skip it
                    break;
                }
            }
        }
    }