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

画像を半透明に。

分類:[.NET]

フォーム内の画像のいくつかを半透明にしたいのですが、上手くいきません。

Console.WriteLine((3 * 0.2F))
DrawFadedImage(g, img, 3 * 0.2F)
hantoumei.Image = ("Picture\gazou.jpg")

Tipsのフェードイン・アウトを参考に上記のように記述してみたのですが、ファイルの記述の部分で「型'String'の値を'System drawing image'に変換できません」と出て来ます。色々試行錯誤をしたものの、やはり無理でした。全く違うやり方でもよいので、半透明で画像を表示させる方法があれば、教えて下さい。

また、その半透明にした画像を重ねると、重なった部分が濃くなる方法もあれば、こちらもお願い致します。
> hantoumei.Image = ("Picture\gazou.jpg")

ですが、文字列を括弧で囲っただけになっています。
管理人様自らの回答ありがとうございます。
ただ、本当に初心者なので、どう訂正していいか分かりません。
("〇〇.jpg")だけではダメなんでしょうか?
Tipsを参考に粘ったところ、始めの問題は解決しましたが、やはり、半透明せずに「使用されたパラメータが有効ではありません」と出ます。

Dim g As Integer
Dim img As Integer

Console.WriteLine((3 * 0.2F))
Dim DrawFadedImage(g, img, 3 * 0.2F)
hantoumei.Image = New Bitmap("Picture\gazou.jpg")

何故なんでしょうか……?
■No27713に返信(家財さんの記事)
> hantoumei.Image = ("Picture\gazou.jpg")
> 「型'String'の値を'System drawing image'に変換できません」
Image プロパティは 「System.Drawing.Image 型」ですが、
右辺の "Picture\gazou.jpg" は「System.String 型」だからです。

> その半透明にした画像を重ねると、重なった部分が濃くなる方法もあれば、
半透明画像を重ね描きすれば、その部分は濃くなりますよ。


■No27722に返信(家財さんの記事)
> Dim g As Integer
> Dim img As Integer
変数 g や img を、Integer 型として扱いたいのでしょうか?

> Dim DrawFadedImage(g, img, 3 * 0.2F)
このコードは、
 Dim DrawFadedImage(0, 0, 1) As Object
という配列を作成している事を意味しますが、そもそもは、
配列を作りたいのではなく、自作メソッドを呼びたいのでは無いでしょうか。
http://dobon.net/vb/dotnet/graphics/hadeinimage.html

> hantoumei.Image = New Bitmap("Picture\gazou.jpg")
相対パスではなく、絶対パス(フルパス)で指定してみてください。
回答ありがとうございます。
>変数 g や img を、Integer 型として扱いたいのでしょうか?
正直なところ、何で宣言をすればいいのか分からずにintegerで宣言しました。
「この変数やプログラムは多分こういう処理をしているんだろう」という
雑な知識Basicから.netまで付き合っているので……。

Tipsにある半透明で画像を表示するところも見まして
丸々コピペしたのですが、それでも半透明にはなりませんでした。
フェードの方は上手く動くのですが……。

ちょっと手詰まりな状態です……。
■No27726に返信(家財さんの記事)
> 回答ありがとうございます。
> >変数 g や img を、Integer 型として扱いたいのでしょうか?
> 正直なところ、何で宣言をすればいいのか分からずにintegerで宣言しました。
Tipsの通りだとすると、gはGraphics、imgはImageではないですか。
家財さんがどういったコードを書いているのかはわからないですが、Tipsのコードをそのまま使用してみてください。
変更する箇所はコントロール名と画像ファイルのパスだけで問題ないはずです。

−−−−−−−−−−
Private Sub PictureBox1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles PictureBox1.Click

  Dim g As Graphics = PictureBox1.CreateGraphics()
  Dim img As Image = Image.FromFile("C:\サンプル.jpg")

  Dim cm As New System.Drawing.Imaging.ColorMatrix()
  cm.Matrix00 = 1
  cm.Matrix11 = 1
  cm.Matrix22 = 1
  cm.Matrix33 = 0.5F
  cm.Matrix44 = 1

  Dim ia As New System.Drawing.Imaging.ImageAttributes()
  ia.SetColorMatrix(cm)

  g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height),0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia)

  img.Dispose()
  g.Dispose()
End Sub
−−−−−−−−−−
一応コードを載せておきますが、Tipsをコピーしただけです^^;
フォーム上にPictureBoxを配置して試してみてください。
回答ありがとうございます。

Public Class Form1

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Dim g As Graphics = PictureBox1.CreateGraphics()
Dim img As Image = Image.FromFile("C:\サンプル.jpg")

Dim cm As New System.Drawing.Imaging.ColorMatrix()
cm.Matrix00 = 1
cm.Matrix11 = 1
cm.Matrix22 = 1
cm.Matrix33 = 0.5F
cm.Matrix44 = 1

Dim ia As New System.Drawing.Imaging.ImageAttributes()
ia.SetColorMatrix(cm)

g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia)

img.Dispose()
g.Dispose()
End Sub

End Class


上記のように丸々コピーしてみましたが、やはり……。
フェードイン・アウトは丸々コピーで上手くいくんですが
これだけは何故かそのまま使用しても、弄くってもエラーは出なくなりましたが
やりたいこと(半透明化)は出来ず……。
■No27756に返信(家財さんの記事)
> Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles 句が抜けているので、これでは何も起きません。
末尾に「 Handles PictureBox1.Click」を加えてみましょう。


>         Dim g As Graphics = PictureBox1.CreateGraphics()
No27631 のスレッドにも書きましたが、CreateGraphics の利用は避けましょう。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=27631&rev=&no=0

CreateGraphics を使ってはいけないというわけでは無いですが、これだと
再描画が発生した場合に、以前描いた内容が消えてしまいます。

新規/既存の Image インスタンスに対して、Graphics.FromImage で得た
Graphics に対して描画するようにするか、もしくは、Paint イベントの
e.Graphics に対して描画するようにした方が良いでしょう。
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html
ありがとうございます。
単純なところだったので、逆に気付きませんでした。
半透明化は完了した……のですが、なんといいますか
私の書き方が悪かったのかもしれませんが、求めていたものと違って……。

クリックすると単に「薄くなった画像」が表示されるだけでして。
「前面や後面の画像が透過して表示される」のが目標だったのですが……。
例えるならPNG画像や透過GIFのようなものをプログラム的に作るのが
目標なんです……。
■No27758に返信(家財さんの記事)
> クリックすると単に「薄くなった画像」が表示されるだけでして。
PictureBox に、半透明化した画像を描画する処理ですし。
(クリックするたびに、だんだん濃くなっていきますね)

透明度が高いほど、当然見えにくくなるわけですから、
色としては、薄くなるとも言えますね。


> 「前面や後面の画像が透過して表示される」のが目標だったのですが……。
前面/背面に、別の画像を描画すれば OK。


> 例えるならPNG画像や透過GIFのようなものをプログラム的に作るのが
「PNG画像を作成する」ならば答えようもありますが、
「PNG画像のようなものを作成する」では答えようがありません。

# “〜のようなもの”の部分を正確に表記してもらわないと…。
2010/12/03(Fri) 14:48:19 編集(投稿者)

申し訳ありません、やはり書き方が悪かったようです。
正しくは「ゲームによく見られるメッセージウィンドウの半透明化処理」です。
MSWを半透明化させ、背景やキャラクターの画像の一部と文字、
正確にはMSWと被る部分のみを半透明化させる。

正直に言えば、PNGや透過GIFやTransparentで再現出来るものならば、それでも良かったのですが、自らのスキルアップのためにもあくまでプログラムで処理することを望んでいましたが、私の知識のなさから上記に挙げたものを使ってでもやりたいと思うようになりました。しかしながら、文字を表示する部分(Label1)を前面にするとキャラの立ち絵が後ろに追いやられて一部(上半身全部表示させるはずが、Label1の部分だけ切り取られるような形で)しか表示されません。
かといって、キャラのグラフィックを前面にすると、今度は真ん中に表示されているキャラグラフィックの部分、中央のあたりに文字が来るとそこだけやはりキャラグラフィックに邪魔をされてしまいます……。

正確なタイトルは「キャラグラフィックとメッセージウィンドウが被る部分のみ、どちらかを半透明化させて、文字を見えるようにしたい」になりますね。

ちなみにですが、PNGや透過GIFやTransparentを使えば、一番後ろの背景(Form1)だけは透明化が上手くいきます。

補足.ちょっと分かりづらいので図で……。

 □    □
■■■ ■□■

黒四角がウィンドウで白がキャラグラフィックと思ってください。
前面後面、3つの透過手段を使っても上記のようになります。
この中央部分を、文字では表現できませんが、言うなら灰色四角にできれば、と。
■No27760に返信(家財さんの記事)
> 文字を表示する部分(Label1)を前面にするとキャラの立ち絵が
> 後ろに追いやられて一部(上半身全部表示させるはずが、
> Label1の部分だけ切り取られるような形で)しか表示されません。
「どのように設定しているのか」が分からないのですが、
それは .NET Tips ( http://dobon.net/vb/dotnet/index.html )の
『PictureBox上のLabelの背景が透明にならない問題の解決法』
を適用した時の話でしょうか?

> キャラのグラフィックを前面にすると、
コントロールを自体を重ね合わせて表現しようとするのではなく、
一つの PictureBox を描画キャンパスとして、そこに対して
奥側の画像を描画 → 手前の画像や文字を描画 →… というように
DrawImage や DrawString を繰り返せば良いと思います。
  • 題名: Re[13]: 画像を半透明に。
  • 著者: 家財
  • 日時: 2010/12/04 11:05:17
  • ID: 27767
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>適用した時の話でしょうか?
はい、そうです。

ようやくですが、見えてきた感じです。
長々とお付き合い下さってありがとうございます。
>コントロールを自体を重ね合わせて表現しようとするのではなく、
ここの一文で形が出来ました。

本当にありがとうございました。
解決済み!

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