- - PR -
透過GIFのリサイズ
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-02-15 21:49
お世話になります。
ファイルから読み込んだGIFをリサイズして保存するアプリを制作したいのですが、下記方法ですと透過色がうまく処理されません。一旦bitmapとして読み込んでるせいだと思うのですが、GIFのまま扱う方法がわからずにいます。良い方法がありましたらご教授おねがいします。 Bitmap image1 = new Bitmap("./test.gif"); int w = src.Width * (倍率); int h = src.Height * (倍率); Bitmap image2 = new Bitmap(w, h); Graphics g = Graphics.FromImage(image2); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(image1, 0, 0, w, h); image2.Save("./out.gif", ImageFormat.Gif); |
|
投稿日時: 2006-02-15 21:51
すみません、コードに誤りありました。修正します。
これでもうまくいきません。宜しくお願いします。 Bitmap image1 = new Bitmap("./test.gif"); int w = image1.Width * (倍率); int h = image1.Height * (倍率); Bitmap image2 = new Bitmap(w, h); Graphics g = Graphics.FromImage(image2); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(image1, 0, 0, w, h); image2.Save("./out.gif", ImageFormat.Gif); |
|
投稿日時: 2006-02-15 22:44
Bitmap(int, int) のコンストラクタを使用した場合、カラーデータ形式は PixelFormat.Format24bppRgb が使われます。
当然透明色は使えません。 明示的に PixelFormat.Format32bppArgb を指定して作成してください。 |
|
投稿日時: 2006-02-16 13:08
Hongliang様前回に引き続きご回答ありがとうございます。
PixelFormat.Format32bppArgbを指定しようと思ったのですが、BitmapコンストラクタではBitmap(Int32,Int32,PixelFormat)かBitmap(Int32,Int32,Int32,PixelFormat,IntPtr)どちらかしかないようで、GIFを読み込む時点でPixelFormatをうまく指定することができません。 読み込み方法についてさらにお知恵を貸して下さい。 |
|
投稿日時: 2006-02-16 14:10
いやいやいや。
gifファイルから読み込んだBitmapには問題なく透過色がついています。 透過色がサポートできていないのは、その読み込んだBitmapを書き込む新しく倍サイズで作ったBitmapの方です。 [ メッセージ編集済み 編集者: Hongliang 編集日時 2006-02-16 14:12 ] |
|
投稿日時: 2006-02-16 23:01
Bitmapに読み込んだ段階で透過色の情報が欠落するものと思ってました。
さっそく、書き込み先のBitmapで Bitmap image2 = new Bitmap(w, h, PixelFormat.Format32bppArgb); として MakeTransparent()メソッドで元画像と同じ透過色にしたいのですが、 元のBitmapから透過色を取得する方法がわかりません。Bitmapクラスには それらしきメソッドが見当たらないように思いますが、どのようにすればよいのでしょうか。 |
|
投稿日時: 2006-02-17 07:35
……テストと知識の双方が不十分なままでした。すいません。
一通りテストして、以下のことが分かりました。
以上のことから、どうやら PixelFormat.Format32bppArgb を経由する限り(そして恐らく必ず経由しなければならない)透過色を再現するのは無理っぽい、です。 .NET(というかGDI+)に頼らない 外部のGIFコンポーネントを使うか(あるかどうかも分かりませんが。GIFは特許問題もありましたし)、自力でヘッダ/LZW圧縮を実装してどうにかするか。手軽な解決は思いつきませんね……。 |
|
投稿日時: 2006-02-17 10:35
Hongliang様。詳細に教えていただき恐れ入ります。
たしかにそのまま保存するだけだと透過色が保持されることを確認しました。 が、加工後のBitmapをGIFとしてSaveする時点で、MakeTransparentの指定色が正しくGIFフォーマットの Transparent Color Index に反映されないようですね。真黒になります。 私の技術レベル、アプリの規模からいって、自力の実装はできそうもありませんので、透過GIFは処理対象外と割り切ります。まずは透過かどうかの判定方法について調査することにします。簡単な判別方法がなければ、直接GIFのTransparent Color Flagを読むしかないかとも思います。 大変勉強になりました。ありがとうございました。 |
1