tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルイメージの透過色について
記事No5616
投稿日: 2007/06/08(Fri) 01:20
投稿者Purple
はじめまして。VBプログラムを初めて1週間程度の者です。
基本的な質問かもしれませんがご容赦ください。

仕様ソフトはVB 2005 expressです。

BitMapイメージ(あるいは他の形式のイメージ)をPictureBoxの背景画像にし、フォーム上に表示させたいのですが、
リソースファイルの画像では透過色を使うことができないものなのでしょうか。

こちらのサイトの「絵画・画像の項目8」のように、WindowsのHDから直接読み込み、MakeTransparentと併用すれば透過色が使えましたが、
この方法だと配布した場合に画像フォルダも可視状態で添付する必要があるので避けたいと思っています。

プロジェクトに画像を取り込んだ状態で、透過色を使う方法があればぜひ教えてください。

[ツリー表示へ]
タイトルRe: イメージの透過色について
記事No5618
投稿日: 2007/06/08(Fri) 11:39
投稿者花ちゃん
> リソースファイルの画像では透過色を使うことができないものなのでしょうか。

どのように リソースファイル を設定されているのか解りませんが、簡単な方法なら

PictureBox2 に表示しておき、それを PictureBox1 で利用するとか。

下記のような方法なら
(リソースに画像を持たせて使用する方法)
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/Resource/


Private Sub Button1_Click(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) Handles Button1.Click
'下記2行は追加
    Dim myAssembly As System.Reflection.Assembly = _
                           System.Reflection.Assembly.GetExecutingAssembly()
 '下記のコメントを外して確認すると "_246.GARA.bmp" が解ります。
   'Debug.WriteLine(myAssembly.GetManifestResourceNames(0))
   Dim myBitmap As System.IO.Stream = _
                  myAssembly.GetManifestResourceStream("_246.GARA.bmp")

  '下記のように変更
    Dim bmp As Bitmap = New Bitmap(myBitmap)   'New Bitmap("..\..\gara.bmp")

'下記以降は変更無し
    Dim g As Graphics
    With PictureBox1

---------------------------------------------------------------------------
---------------------------------------------------------------------------
因みに、MS のサンプルを見習って

   Dim myBitmap As System.IO.Stream = _
                  myAssembly.GetManifestResourceStream("246.GARA.bmp")

のようにすると読み込めない "246.GARA.bmp" と "_246.GARA.bmp" の違いが
よく解りません、何方かフォロー願います。

_246 は、ルート名前空間が適用されるようで、私の場合、プロジェクト名を番号で
管理しているので、ルート名前空間には、先頭の文字が数値の場合、_246 のように
変更されるようです。
本題の質問よりこちらの方で悩んでおりました。

[ツリー表示へ]
タイトルRe^2: イメージの透過色について
記事No5619
投稿日: 2007/06/08(Fri) 18:32
投稿者Purple
こんばんわ。
早くのご回答ありがとうございます。
さっそくですが、参考プログラムをいろいろ試して見て分かりました。

原因は以下の通りでした。

(pict1.bmpというイメージを、黒色透過で表示する場合)
※Private Sub 〜 End Subは省略です。

●透過できなかったプログラム
My.Resources.pict1.MakeTransparent(Color.Black)
PictureBox1.Image = My.Resources.pict1

これを次に直すと透過できました。

●透過できたプログラム
Dim bmp As Bitmap
bmp = My.Resources.pict1
bmp.MakeTransparent(Color.Black)
PictureBox1.Image = bmp

この場合、イメージ名をあらかじめBitmapで変数宣言しておかないといけないのですね。
お手数おかけしてしまいました。

[ツリー表示へ]
タイトル複数のコントロールの透過処理について
記事No5734
投稿日: 2007/06/27(Wed) 19:22
投稿者Purple
こんばんわ、以前透過について教えていただいた者です。
(仕様ソフト:VB 2005 express)

さっそくですが再度、透過についての質問をさせてください。

MakeTransparent等の方法で透過させた部分には、通常Formの背景が表示されますが、下層に他のコ
ントロールがあった場合、重なった部分が消えてしまう(欠けてしまう)現象が起きてしまいま
す。これは正常な現象なのでしょうが、2種類以上のコントロールを透過させて重ね合わすのには不
都合になってしまいます。

試しに、

        PictureBox1.Controls.Add(PictureBox2)

を使うと、Box1は隠れなくなりますがBox2はBox1の透過部分に隠れてしまいました。

また、

        Dim img1 As Image = My.Resources.画像A
        Dim img2 As Image = My.Resources.画像B
        Dim g As Graphics = AutoGraphics(PictureBox1)
        Dim ia As New ImageAttributes()
        ia.SetColorKey(Color.White, Color.White)

        g.DrawImage(img1, New Point(0, 0))
        g.DrawImage(img2, New Rectangle(New Point(0, 0), img2.Size), _
            0, 0, img2.Width, img2.Height, GraphicsUnit.Pixel, ia)

以上の方法だとPictureBox1上に画像Aと画像Bを重ねられましたが、それぞれの画像を動かしたり消
したりできなくなってしまいました。


例えば、PictureBox1とPictureBox2に「●(黒部分以外は透過)」のイメージを読み込み、それぞ
れ左右から近づけていっても、接触したときにどちらかの●が透過部分に隠れないようにしたいと
思っています。「スプライト処理」、または「レイヤー構造」と呼ばれているようですが、適した
方法を見つけることができません。

もしなにか分かる方がいましたら、アドバイスをよろしくお願いします。

[ツリー表示へ]