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(); }); }
// 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; } } } }