GIF アニメーションを読み込んで、フレームごとにビットマップに変換する必要があります。そのために、Drawing.Imaging ライブラリを使用して GIF ファイルをフレームごとに抽出し、各フレームをビットマップにキャストしています。
連続するフレームが同じで、ピクセルの違いがない場合を除いて、すべてが正常に機能します。ライブラリはそのようなフレームをドロップしているようです。
私は簡単なテストでその結論に達しました。最後の円が消える瞬間と新しい円がまだ表示されていない瞬間の間に一時停止して成長および縮小する円のアニメーションを作成しました。抽出したビットマップで構成されるアニメーションを再生すると、一時停止が表示されません。同じフレーム長で同じフレームの量が異なる GIF を比較すると、返される totalframescount 値が異なります。また、Web ブラウザーが同一の連続したフレームを正しく表示することも確認しました。
public void DrawGif(Image img)
{
FrameDimension dimension = new FrameDimension(img.FrameDimensionsList[0]);
int frameCountTotal = img.GetFrameCount(dimension);
for (int framecount = 0; framecount < frameCountTotal; framecount++)
{
img.SelectActiveFrame(dimension, framecount);
Bitmap bmp = new Bitmap(img); //cast Image type to Bitmap
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 16; j++)
{
Color color = bmp.GetPixel(i, j);
DrawPixel(i, j, 0, color.R, color.G, color.B);
}
}
- 誰かがそのような問題に遭遇しましたか?
- 私はC#にかなり慣れていないので、.NET lib を変更する方法はありますか?
- ライブラリの変更を伴わない、私が気付いていない問題の解決策があるかもしれません。
更新されたコード - 結果は同じです
public void DrawGif(img)
{
int frameCountTotal = img.GetFrameCount(FrameDimension.Time);
for (int framecount = 0; framecount < frameCountTotal; framecount++)
{
img.SelectActiveFrame(FrameDimension.Time, framecount);
Bitmap bmp = new Bitmap(img);
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 16; j++)
{
Color color = bmp.GetPixel(i, j);
DrawPixel(i, j, 0, color.R, color.G, color.B);
}