カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2017年06月15日(木)

透明色を含む GIF アニメーションをうまく保存できない不具合修正

ドロー系のお絵描きソフト、 ストローク で作成した 2 枚の画像から
アニメーションを生成するソフトのテスト、デバッグ中です。

今日は、透明色を含む GIF アニメーションを
うまく保存できない不具合を修正しました。

WIC のクセがすごいので、大変でしたが、一応
Windows 10 ではうまく動くようになりました。

GIF アニメーションファイルを作成する場合、
表示時間や透明色を設定する必要があります。

Native Image Format Metadata Queries では、
/grctlext/Delay や、/grctlext/TransparencyFlag などに相当します。

ところが、これらのプロパティを、 IWICMetadataQueryWriter
で設定すると、色々とおかしなことが起こります。

Windows Imaging Component and Animated GIF Files に、
どんなおかしな事が起こるかと、回避方法が載っていますが、
完全ではありませんし、直し方もよくありませんでした。

まず、プロパティを設定するタイミングですが、
WriteSourceCommit の間で設定すると無視されます。

ちなみに Windows Imaging Component and Animated GIF Files
にある、Commit の前で、QueryWriter を取得して、
Commit 後で設定する方法は、単に次のフレームに
設定されちゃうっぽいので、やらない方がいいと思います。

特に問題にならないはずの、/imgdesc/Left
の設定がずれるのでたぶんそうです。

なので、正しい設定場所は、
画像データーを書き込む前のタイミングです。

ところが、画像データーを書き込む前のタイミングで
/grctlext/ 配下のプロパティを書き込むと、
画像の書き込み時に設定されていた、
/grctlext/TransparencyFlag や、
/grctlext/TransparentColorIndex が
0 になっちゃいます。

おそらく、/grctlext/ 配下のプロパティを
1 つでも設定すると、その他のプロパティも
初期設定され、WriteSource ではそれらの値を
上書きしないために、おかしな値のままになるんでしょう。

直し方ですが、/grctlext/ 配下で必要なプロパティを
全て、自分で設定しちゃえば OK です。

/grctlext/TransparentColorIndex
は簡単には取得できませんが、パレットの
0 番目が必ず透明色になるようにしたり、
パレットから透明色のインデックスを
検索したりすれば計算できます。

自分は、 InitializeFromBitmap で計算したパレットの透明色を
0 番目の位置に移動。そのパレットで画像データーを減色して、
必ず透明色のインデックスが 0 となるようにしました。

・・・

ま、気になる方は、とりあえず
ストロークでもお試しください。

ストロークループアニメーターのアイコン作成にも使用したので、
実用は可能なはずですよ。

最新版は、こちらのページからダウンロードできます

GIF の場合、背景色のインデックスは
フレーム毎に設定できません。

よって、透明を背景色としたい場合は、
フレーム毎の透明色のインデックスは
共通にする必要がありそうです。

ストローク
ストローク ダウンロード
ストローク サンプル画像
ストローク 更新履歴
ご意見・ご要望連絡窓口


コメント
コメントする