IndexedGif.cs
// 
// このコードは、DioDocs for Imaging のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
// 
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Imaging;
using GrapeCity.Documents.Drawing;
using DsImagingWeb.Demos.Common;

namespace DsImagingWeb.Demos
{
    // このサンプルは、トゥルーカラーフレームを含む既存の GIF
    // MakeGif サンプルで生成されたもの)を読み込み、
    // その各フレームをインデックス付き 8bpp 画像に変換します。
    // また、変換後の GIF にグローバルパレットを追加します。
    //(パレットは最初のフレームから取得されます。)
    public class IndexedGif
    {
        public string DefaultMime { get => Common.Util.MimeTypes.GIF; }

        public Stream GenerateImageStream(string targetMime, Size pixelSize, float dpi, bool opaque, string[] sampleParams = null)
        {
            if (targetMime != Util.MimeTypes.GIF)
                throw new Exception("This sample only supports GIF output format.");

            var ms = new MemoryStream();
            // ソースとなるGIFからフレームを読み込み、それらを8bppに変換してターゲットのGIFに保存します。
            using (var gr = new GcGifReader(Path.Combine("Resources", "Gifs", "goldfish.gif")))
            using (var gw = new GcGifWriter(ms))
            {
                for (int i = 0; i < gr.Frames.Count; ++i)
                {
                    // 最初のフレームに基づいて、ターゲットのGIFにグローバルパレットを追加します。
                    if (i == 0)
                        using (var tbmp = gr.Frames[i].ToGcBitmap())
                            gw.GlobalPalette = tbmp.GenerateOctreePalette(256);

                    var indexedBmp = gr.Frames[i].ReadAsIndexed8bppBitmap();
                    gw.AppendFrame(indexedBmp, 0, 0, GifDisposalMethod.DoNotDispose, 16);
                }
            }
            ms.Seek(0, SeekOrigin.Begin);
            return ms;
        }
    }
}