【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

アニメーションGIFの変換

SilverlightではGIFが使えません。PNGに変換しようとしたのですが、数が多くてアニメーションGIFが混ざっていたため、GDI+(System.Drawing)で情報を取得して変換しました。変換部分のコードは以下の通りです。

private void GifToPng(string gif)
{
    var fn = Path.Combine(Path.GetDirectoryName(gif),
        Path.GetFileNameWithoutExtension(gif));
    var bmp = new Bitmap(gif);
    var fd = new FrameDimension(bmp.FrameDimensionsList[0]);
    int count = bmp.GetFrameCount(fd);
    if (count == 1)
        bmp.Save(fn + ".png", ImageFormat.Png);
    else
    {
        var pi1 = bmp.GetPropertyItem(0x5100); // FrameDelay
        var pi2 = bmp.GetPropertyItem(0x5101); // LoopCount
        var delays = new int[count];
        var sb = new StringBuilder();
        for (int i = 0; i < count; i++)
        {
            bmp.SelectActiveFrame(fd, i);
            bmp.Save(fn + "_" + (i + 1) + ".png", ImageFormat.Png);
            delays[i] = BitConverter.ToInt32(pi1.Value, i * 4) * 10;
            if (i > 0) sb.Append(", ");
            sb.AppendFormat("{0}ms", delays[i]);
        }
        int loop = BitConverter.ToInt16(pi2.Value, 0);
        Debug.WriteLine(string.Format(
            "{0}: count = {1}, loop = {2}, delays = {{ {3} }}",
            gif, count, loop, sb));
    }
}