- PR -

C#で画像ファイルを読み込んで透明色指定して表示する方法

1
投稿者投稿内容
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2001-11-17 22:50
 BMPファイルを読み込んで、左上隅のピクセルの色を透明色と見なして表示するプログラムが、C#ではどの程度コード量で書けるかと試してみたところ。
 VS.NETでWindowsアプリケーションのスケルトン作って、書きコードの書き足しだけで済んでしまいました。
 6〜7年前にWindows APIで書いたときは、けっこう面倒なコードを書いたって言うのに、たったこれだけとは! しかも、読み込む画像はJPEGだろうとPNGだろうとOKだし。

コード:
private Bitmap targetBMP;
private void Form1_Load(object sender, System.EventArgs e)
{
	targetBMP = new Bitmap("c:\test.bmp");
	targetBMP.MakeTransparent( targetBMP.GetPixel(0,0) );
}
private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
	Graphics g = e.Graphics;
	g.DrawImage( targetBMP,0,0 );
}


_________________
Yngwie
会議室デビュー日: 2001/11/19
投稿数: 1
投稿日時: 2001-11-19 19:23
たしかにBitmapクラスは便利ですよね。

ところで、左上隅のピクセルの色を透明色と見なして表示する、というのは何か意味があるのでしょうか?
autumn
大ベテラン
会議室デビュー日: 2001/07/27
投稿数: 215
投稿日時: 2001-11-19 20:00
引用:

ところで、左上隅のピクセルの色を透明色と見なして表示する、というのは何か意味があるのでしょうか?


 意味はあります。
 アルファチャンネルなどがない画像フォーマットで、透明色を**安易**に扱う常套手段の1つです。
1) 画像を描き、透明部分を、絶対に使わないような突飛な色で塗っておく
2) 本体画像がコーナーの部分まで描かれていることは滅多にない
3) 背景色が描かれている可能性の高いピクセルとして左上隅のピクセルを選ぶ
4) ゲームのスプライトのような用途なら、ほとんどこれでOK
5) 万一左上隅も描いてしまう画像が出てきたら右上隅にでも変えましょうか
6) 四隅が駄目なら、こういう安易な方法は諦めましょう。人間、諦めが肝心です

_________________
okismile
会議室デビュー日: 2002/07/16
投稿数: 2
投稿日時: 2002-07-16 00:17
川俣様の例文にしたがって背景(haikeiBMP)の手前に画像(targetBMP)
を描く処理を考えてみました。

private Bitmap targetBMP, haikeiBMP;
private void Form1_Load(object sender, System.EventArgs e)
{
haikeiBMP = new Bitmap("c:\back.bmp");
targetBMP = new Bitmap("c:\test.bmp");
targetBMP.MakeTransparent( targetBMP.GetPixel(0,0) );
}
private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawImage( haikeiBMP,0,0 );
g.DrawImage( targetBMP,0,0 );
}

そこで質問なのですが、この処理で生成された
二つのBMPを合成して一つのBMPオブジェクトに
するというようなことはできるのでしょうか?

空の画像オブジェクトを生成し、ピクセルごとに
targetBMPの透明部分にはhaikeiBMPの色を、
そうでない部分にはtargetBMPの色を
Getpixel、SetPixelで設定するというような方法は
思いついたのですが、あまりに時間がかかってしまいます。

なにか、ほかによい方法をご存知の方がおられましたら、
教えて頂けるとありがたいです。

[ メッセージ編集済み 編集者: okismile 編集日時 2002-07-16 00:18 ]

[ メッセージ編集済み 編集者: okismile 編集日時 2002-07-16 00:19 ]
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2002-07-16 03:45
Bitmap クラスのコンストラクタの中に,Graphics オブジェクトをとるものがあるようなので,それを使えばよいと思います。例えば,こんな感じでしょうか。
コード:
Bitmap bmp = new Bitmap(haikeiBMP.Width, haikeiBMP.Height, g);


試したわけではないので,これで動くかどうかはわかりませんが :-)
okismile
会議室デビュー日: 2002/07/16
投稿数: 2
投稿日時: 2002-07-16 23:51
ご返答ありがとうございます。

ただ、私の考えとしてはhaikeiBMPとtargetBMPを
合成したいという意味なのですが。
説明が不十分だったかもしれませんね、すみません。

イメージとしては
gouseiBMP = haikeiBMP + targetBMP
のような感じです。もちろんこのまま書いてもだめでしたが。
1

スキルアップ/キャリアアップ(JOB@IT)