C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 透過Gifを作成するには?


(過去ログ 28 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■13211 / inTopicNo.1)  透過Gifを作成するには?
  
□投稿者/ Kao (6回)-(2008/01/25(Fri) 20:55:35)

分類:[C#] 

また、お世話になります。
よろしくお願いいたします。

透過Gifを作成するには、どうしたら良いのでしょうか?

ひとまず、「透過色に黒色を指定」→「黒に塗りつぶし」
→「gif保存」という流れにしてみたのですが、
背景黒色が表示されてしまいました。

ご助言お願いいたします。

//----------------------------------------------------
//大きさを指定してBitmapオブジェクトの作成
Bitmap img = new Bitmap(200, 100);
//背景色を透過に設定する
img.MakeTransparent(System.Drawing.Color.Black);
//imgのGraphicsオブジェクトを取得
Graphics g = Graphics.FromImage(img);
//黒に塗りつぶす
g.FillRectangle(Brushes.Black, g.VisibleClipBounds);
//ノイズを入れる
//(適当な色の点を適当な位置にうちまくる)
Random rnd = new Random();
for (int i = 0; i < 1000; i++)
{
//色の作成
Color col = Color.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256));
//1つのピクセルの色を変える
img.SetPixel(rnd.Next(img.Width), rnd.Next(img.Height), col);
}
//作成した画像を保存する
img.Save("test.gif", ImageFormat.Gif);
//リソースを開放する
img.Dispose();
g.Dispose();

引用返信 編集キー/
■13223 / inTopicNo.2)  Re[1]: 透過Gifを作成するには?
□投稿者/ Hongliang (231回)-(2008/01/25(Fri) 22:33:18)
Hongliang さんの Web サイト
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28435&forum=7&6
ここに以前書きましたが、.NET というか GDI+ では透過色持ちの GIF の保存を基本的にサポートしていません。
上記には書き洩れていますが、Indexed な PixelFormat を持った Bitmap を作成し、Palette に透過色を設定し、LockBits で直接ビットデータを書いていく、という手順をとれば Save したときに正しく保存してくれます。もちろん Graphics での描画も SetPixel もできません。

なお WPF の GifBitmapEncoder は透過色持ちの画像の保存に対応しています。
引用返信 編集キー/
■13227 / inTopicNo.3)  Re[2]: 透過Gifを作成するには?
□投稿者/ やじゅ (48回)-(2008/01/25(Fri) 23:47:09)
やじゅ さんの Web サイト
No13223 (Hongliang さん) に返信
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28435&forum=7&6
> ここに以前書きましたが、.NET というか GDI+ では透過色持ちの GIF の保存を基本的にサポートしていません。

透過は、簡単にはいかないようですね。うーむ・・・

品質度外視のテストコード(Hongliang さんのです)
http://hongliang.seesaa.net/article/13377058.html

透過GIFのリサイズ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28435&forum=7&

12・1月はGIFファイルを扱ってみよう
http://www.winapi-database.com/special/2001_12_2002_1/index.html

Visual Basic .NET を使って、 .gif ファイルを新しいカラー テーブルと保存します。
http://support.microsoft.com/kb/319591/ja
Visual C#を使用すると、 .gif ファイルに新しいカラー テーブルを保存する方法
http://support.microsoft.com/kb/319061/ja
引用返信 編集キー/
■13271 / inTopicNo.4)  Re[3]: 透過Gifを作成するには?
□投稿者/ Kao (7回)-(2008/01/26(Sat) 14:39:19)
2008/01/26(Sat) 15:03:42 編集(投稿者)
「C#で.gif ファイルに新しいカラーテーブルを保存する方法」を用いて、
カラー画像を扱うにはどうしたら良いのでしょうか。

------------------
Hongliangさん、やじゅさん
ありがとうございます。
# どの方法がわかりそうか読んでいてお礼が遅くなってしまいました(^^;;

# バイナリを作成する手法は道のりがあまりに険しく
# WPFのGifBitmapEncoderは「プロジェクトの種類がこのインストに対応していない」と弾かれ

一通り目を通してみた所、私にはこれ↓がわかりやすそうなので利用してみました。
# Visual C#を使用すると、 .gif ファイルに新しいカラー テーブルを保存する方法
# http://support.microsoft.com/kb/319061/ja
早速リンク先のコードを入れ、
 private void button1_Click(object sender, EventArgs e)
 {
    Image clsimage = Image.FromFile(@"c:\test.bmp");
    SaveGIFWithNewColorTable(clsimage, @"c:\test.gif", 36, true);
 }
と呼び出したところ、黒色は透明色になりました。やったぁ!!

でも、元がカラー画像BMPなのにモノクロgifになってしまいました。
カラーを維持するには、どのように手を入れたらいいのでしょう…。

アドバイスをお願いいたします。

引用返信 編集キー/
■13272 / inTopicNo.5)  Re[4]: 透過Gifを作成するには?
□投稿者/ やじゅ (54回)-(2008/01/26(Sat) 15:43:50)
やじゅ さんの Web サイト
No13271 (Kao さん) に返信
> SaveGIFWithNewColorTable(clsimage, @"c:\test.gif", 36, true);
>
> でも、元がカラー画像BMPなのにモノクロgifになってしまいました。
> カラーを維持するには、どのように手を入れたらいいのでしょう…。
>

元画像を256色に減色した上で
SaveGIFWithNewColorTable(clsimage, @"c:\test.gif", 256, true);
としても駄目ですか?
引用返信 編集キー/
■13273 / inTopicNo.6)  Re[5]: 透過Gifを作成するには?
□投稿者/ Kao (8回)-(2008/01/26(Sat) 16:19:58)
やじゅさん、いつもありがとうございます!

確認してみましたが、変わらずグレーになってしまいました。
どうも、下記コードの部分で灰色のカラーパレットを生成しているようです。
ということは…
仮に、その部分で256色カラーのパレットを生成させたとしても、
元画像は全く異なる色の画像に変換されてしまいそうですね。

う〜ん・・・・
やりたいことは単純なのですが、どうやって実現したらいいのでしょうね…
1.256色未満の元画像を
2.指定した色を透明色として
3.透過GIFを作成

リンク先のコードとにらめっこしてるのですが、閃いてきません…。
何かアイデアありましたら、お願いいたします〜

    // Initialize a new color table with entries that are determined
    // by some optimal palette-finding algorithm; for demonstration purposes, use a grayscale.
    for (uint i = 0; i < nColors; i++)
    {
        uint Alpha = 0xFF;                          // Colors are opaque.
        uint Intensity = i * 0xFF / (nColors - 1);  // Even distribution. 
        uint Intensity2 = 100;  // Even distribution. 
        // The GIF encoder makes the first entry in the palette
        // that has a ZERO alpha the transparent color in the GIF.
        // Pick the first one arbitrarily, for demonstration purposes.
        if (i == 0 && fTransparent) // Make this color index...
            Alpha = 0;          // Transparent
        // Create a gray scale for demonstration purposes.
        // Otherwise, use your favorite color reduction algorithm
        // and an optimum palette for that algorithm generated here.
        // For example, a color histogram, or a median cut palette.
        pal.Entries[i] = Color.FromArgb((int)Alpha,
                                        (int)Intensity,
                                        (int)Intensity,
                                        (int)Intensity);
    }


引用返信 編集キー/
■13276 / inTopicNo.7)  Re[6]: 透過Gifを作成するには?
□投稿者/ Hongliang (232回)-(2008/01/26(Sat) 17:26:52)
Hongliang さんの Web サイト
元画像が 256 色以下しか使っていないのが明らかなら減色アルゴリズムとか不要なので比較的簡単でしょう。
・同じサイズで PixelFormat.Format8bppIndexed の Bitmap を用意
・元 Bitmap と新 Bitmap の BitmapData を取得
・元 Bitmap の各ピクセルを順に調査
 ・そのピクセルの色が初めて使用された色ならパレットに追加
  ・透過色にしたい色だったら A を 0 にする
 ・新 Bitmap の同じピクセル位置にその色のパレット番号を設定
てなもんです。
ループ中のパレット代わりには Dictionary<Color, int> が便利でしょう。
引用返信 編集キー/
■13277 / inTopicNo.8)  Re[7]: 透過Gifを作成するには?
□投稿者/ Kao (9回)-(2008/01/26(Sat) 17:42:07)
Hongliang さん

ありがとうございます!
今から調べながら頑張ってみます。
引用返信 編集キー/
■13279 / inTopicNo.9)  Re[6]: 透過Gifを作成するには?
□投稿者/ やじゅ (55回)-(2008/01/26(Sat) 18:00:55)
やじゅ さんの Web サイト
No13273 (Kao さん) に返信
>
> 確認してみましたが、変わらずグレーになってしまいました。
> どうも、下記コードの部分で灰色のカラーパレットを生成しているようです。

// Create a gray scale for demonstration purposes.
ほんとですね、グレースケールって書いてあるや(^^;
パレット部分は単なるサンプルってことなのね。
引用返信 編集キー/
■13290 / inTopicNo.10)  Re[7]: 透過Gifを作成するには?
□投稿者/ Kao (10回)-(2008/01/26(Sat) 19:29:23)
No13279 (やじゅ さん) に返信

みたいですね〜。
それで、カラーを↓のように割り当ててみた所、カラーは出るようになったんですが、
元画像のカラーは下記カラーに差し替えられてしまいました。

pal.Entries[0] = Color.FromArgb( 0, 0x93, 0xff, 0xff);
pal.Entries[1] = Color.FromArgb(255, 0x93, 0xc9, 0xff);
pal.Entries[2] = Color.FromArgb(255, 0x93, 0x93, 0xff);
pal.Entries[3] = Color.FromArgb(255, 0x93, 0xff, 0x93);
pal.Entries[4] = Color.FromArgb(255, 0xff, 0xff, 0x93);
pal.Entries[5] = Color.FromArgb(255, 0xff, 0xc9, 0x93);
pal.Entries[6] = Color.FromArgb(255, 0xff, 0x93, 0xc9);
pal.Entries[7] = Color.FromArgb(255, 0xff, 0x93, 0x93);

考えてみたらリンク先のコードはすでに「任意に決めたカラーコードに置き換え」という処理を行っているので、
このコードをいじれば求めていることが出来るような気がしてきました。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -