最近アニメーションGIFs
のフレーム(ビットマップと期間)の読み込みについて別のSO questionに応答しようとしていました。コードはpastenbinにあります。私のdevのライブラリにそれを移動する前に、このコードに追加のテストをやっている間、私はこのコード行に問題があることに気づいたMonoMac System.Drawing.Image.GetPropertyItem(0x5100)
:
//Get the times stored in the gif
//PropertyTagFrameDelay ((PROPID) 0x5100) comes from gdiplusimaging.h
//More info on http://msdn.microsoft.com/en-us/library/windows/desktop/ms534416(v=vs.85).aspx
var times = img.GetPropertyItem(0x5100).Value;
これを使用してWindowsネット上でこれを実行している場合(example GIF )、配列はアニメーションのフレームの量と同じサイズで、GIF
であり、フレームの長さで埋められます。この場合、(BitConverter.ToInt32())に5つの期間変換バイト[20]:MonoMacで
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
しかし、このコード行は同じ、例えばGIFのみに変換byte[4]
を返します1時間(最初の):
[75,0,0,0]
私は、10の異なるGIF's
のためにこれをテストし、結果は常に同じです。 Windowsでは、すべての期間は、[]バイトであるMonoMacのみ、最初の期間一覧表示しながら:モノラルSystem.Drawing.Image
source codeを見てみると
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
を、長さがGDIラッパーである、この方法で設定されているように見える。
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
しかし、実際には問題はありませんが、私の実装ではソースではありません。私は何かを見逃しているのですか、これはバグですか?
私はあなたがMono GDI Plusの実装で答えを見つけると信じています。私はそれを見てみましたが、何が起こっているのかを解読するためのgifコーデックに関する専門知識はありません。以下は、私が見つけたもののいくつかです。 [Image.FromFile](https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs)は、[libgdiplus](https:// github。 com/mono/libgdiplus/tree/master/src)。 libgdiplusの中には画像を読み込む関数があります。ファイル[gifcodec.c](https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c)内の関数 'gdip_load_gif_image'がgifイメージを読み込みます。 –
'gdip_load_gif_image'の内部で何が起こるのか調べる必要があります。私が言及したように、それは画像がロードされ/デコードされ、バグがどこにあるのかがわかる場所です。私は何が起こっているのか把握するためのGIFの専門知識を持っていません。がんばろう。 –