Working with GIF images in Windows Phone
The Twitter for Windows Phone team used the ImageTools project from Codeplex to decode gifs. It worked well, but when we implemented there were two things that bothered me a little:
- The decoder was not perfect. In our experience, it does ~90% of the images we tested [and that was thousands of images, so representative test]
- There was one infinite loop that bothered me. Has to do with nextflag during decoding. The Decoder checks for flags to be != 0, and for some odd reason we have seen gifs with nextFlag = –1; this can send your app into an infinite loop.
I knew there were other libraries and partners were using these (for example, the GifDecoder library shared a long while ago by Joe Stegman).
Today, I finally compared these two libs side-by-side. I used ~400 images. 25% came from a list of Gifs that had known issues. The other 75% was a random selection by looking at a Twitter user, and downloading his followers and filtering for the ones that used gifs.
Decoding wise, these two libraries are pretty much the same code. I should have started by comparing that before I wrote my test. Instead, I found it by accident as I dived in to fix the infinite loop above.
The results are pretty inline with our original ~90% assessment. My tests are a bit lower but again it is because I spiked the test.
The codeplex library is getting updated a lot more, and is growing and getting fixes, so that is what I am sticking with for my projects.
They have done a lot of work on their AnimatedImage control (which supports animated gifs, looks pretty neat (though I have to say animated gifs feels like going back in time).
If you need to decode Gifs, I do recommend you use this library. It is better than nothing. Please do make sure you:
- Download the latest from codeplex. It is getting updated often.
- Test it for infinite loops. You can download the source for my comparison app. I am attaching it to this post. Or you can just check the source for the library. The current issue is at ImageTools.IO.Gif.GifDecoder.Decode () their loop checks for while nextFlag != 0 …. and I simply tweaked it to while nextFlag > 0 … I have no idea what my changed does to GIF decoding since I know nothing about the format, but I know that I can get ~90% of my Gifs to decode and I don’t have the infinite loop, so it works for me..
I am sure the library will improve over time, I pinged the folks with my tests and my results in case it helps improve.
Source for my little test, and source for the libraries I used (with small changes) are in skydrive
Happy Windows Phone coding!