DOBON.NET DOBON.NETプログラミング掲示板過去ログ

imageの合成

  • 題名: imageの合成
  • 著者: JACK
  • 日時: 2010/11/18 16:36:42
  • ID: 27602
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[.NET Framework2.0]
分類:[.NET]

つい先週までVB5を使用していたのですが
VS2010を購入し右往左往しています。
αチャンネルの重ね合わせで
PictureBox1.BackgroundImageに背景
PictureBox1.Imageに絵を置くことで透過で表示できるまでは理解できました
さらに複数重ねたいのですが
PictureBox1.Image+BackgroundImageを一枚の絵として
PictureBox2.BackgroundImageにいれることは可能でしょうか?

VB5の時はbitbldで透過ではなくマスク処理で重ね合わせていました。
αチャンネルを使用したいために.NETに移行しました。
どなたかご教授いただけたら幸いです。
■No27602に返信(JACKさんの記事)
> さらに複数重ねたいのですが

Graphics クラスを用いて、自前で描画してみてください。

VB5 で重ね合わせて描画する場合、マスクなしの背景透過画像として
使えるのは Icon ぐらいでしたが、.NET では、背景透過な GIF や PNG も
サポートしていますので、より簡単に重ね合わせ描画を行えます。
  • 題名: Re[2]: imageの合成
  • 著者: JACK
  • 日時: 2010/11/19 16:47:11
  • ID: 27607
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
魔界の仮面弁士様、ご返答ありがとうございます。
ちょっと調べてみましたが1日でどうこうなりそうにありません。
現在調べた結果では
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As_
System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
 e.Graphics.DrawImage(_bmp, 0, 0, _bmp.Width, _bmp.Height)
End Sub

Private _bmp As Image
のようなやり方を使ってみましたが
_bmp=Image.FromFile("aaa.png")
のあとにαチャンネルでの透過png
_bmp=Image.FromFile("bbb.png")
を表示するとaaa.pngが消えてしまいました。
現在のレベルではこんな感じです

Private Sub を作らずに
Dim g As Graphics = CreateGraphics()



g.Dispose()
で処理できないかと画策中です
できれば具体的に教えていただければ幸いです
2010/11/19(Fri) 22:13:06 編集(投稿者)
2010/11/19(Fri) 22:13:01 編集(投稿者)

魔界の仮面弁士様、すみません。これでできました。

Dim g As Graphics
With PictureBox1
.Image = New Bitmap(800, 600)
g = Graphics.FromImage(.Image)
End With

g.DrawImage(Image.FromFile("aaa.png"), 0, 0)
g.DrawImage(Image.FromFile("bbb.png"), 0, 0)

g.Dispose()

ただ拡大されてしまうのが何故か理解できません
■No27608に返信(JACKさんの記事)
> ただ拡大されてしまうのが何故か理解できません
拡大ってのはどんな感じでしょうか?

800*600 の絵を作っているのに、全体が PictureBox と同じ大きさになるのでしょうか?
もし、そうであれば、PictureBox の SizeMode プロパティを Normal にしてみてください。

> g.DrawImage(Image.FromFile("aaa.png"), 0, 0)
> g.DrawImage(Image.FromFile("bbb.png"), 0, 0)
Image.FromFile の戻り値は Dispose が必要です。
忘れると開いていたファイルがすぐには閉じられないので移動できない、消せないなどの症状を招きます。
2010/11/21(Sun) 17:23:19 編集(投稿者)

返信どうもありがとうございます。
なぜか133%に拡大されます。
800/600?と思い
.Image = New Bitmap(600, 600)
にして見ましたがwidthが600になっただけで縦は133%です。
(出した絵のPrintScreenにて確認)
PictureBox の SizeMode プロパティは Normal でしたが念のため
PictureBox1.SizeMode = PictureBoxSizeMode.Normal
をいれてもダメでした。
pngの画像サイズは800*600を確認しました。
仮に
PictureBox1.Width = 1200
PictureBox1.Height = 1000
・・・
.Image = New Bitmap(1200, 1000)
にするとPrintScreenにて取った画像が1067*800になってました。

解決策として
.Image = New Bitmap("aaa.png")
にしたら800*600になりました。

> Image.FromFile の戻り値は Dispose が必要です。
> 忘れると開いていたファイルがすぐには閉じられないので移動できない、消せないなどの症状を招きます。

具体案があれば教えて頂ければ幸いです。
現在VB5を糧にVB2010に日進月歩の毎日です。
みなさんど素人のような質問にご返答いただき感謝いたします
解決済み!
> なぜか133%に拡大されます。

DrawImageで描画するときに、画像の大きさ(800, 600)を指定してみてください。

画像ファイルを表示する
http://dobon.net/vb/dotnet/graphics/drawimage.html#section5

>>Image.FromFile の戻り値は Dispose が必要です。
>>忘れると開いていたファイルがすぐには閉じられないので移動できない、消せないなどの症状を招きます。
>
> 具体案があれば教えて頂ければ幸いです。

Image.FromFileの戻り値を変数に代入しておき、必要なくなったらそのDisposeメソッドを呼び出すだけです。
  • 題名: Re[6]: imageの合成
  • 著者: JACK
  • 日時: 2010/11/24 11:50:38
  • ID: 27632
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
ご返答ありがとうございます。
やはりうまくいきませんね
下記で試した結果サイズ指定したもののみ100%になります
.Image = New Bitmap(800,600)
...
g.DrawImage(Image.FromFile(aaa.png), 0, 0, 800, 600)
でちゃんといけましたがそれ以降
g.DrawImage(Image.FromFile(bbb.png"), 0, 0)
bbbは133%になります

やはり
.Image = New Bitmap("aaa.png")
で最初に読込み
g.DrawImage(Image.FromFile(bbb.png"), 0, 0)
だとそれ以降も100%になりますね

> Image.FromFileの戻り値を変数に代入しておき、必要なくなったらそのDisposeメソッドを呼び出すだけです。http://dobon.net/vb/dotnet/graphics/drawimage.html#section5
ありがとうございます。必要になれば使わせていだたきます。
現在ゲームを作成しているのでとりあえずファイルがロックされても
問題ないかと思ってます。

DOBON.NET | プログラミング道 | プログラミング掲示板