none
VB6.0でPictureBox 背景色透明にしたい RRS feed

  • 質問

  • こんにちは

    VB6.0で2つのPictureBoxの間で画像をコピーしたいですが、

    pictureのbackcolorをコピーしてしまうことがありました。

    以下のようです。

    With Picture2
                .Refresh
                .PaintPicture Picture1.Image, 0, 0, 1024, 1024, 128, 0, 1024, 1024
    End With

    pictureの背景色が透明にしたら表の画像がコピーできるかと思いました。

    教えていただけませんか。


    • 編集済み xiaoqishi 2014年4月14日 9:05
    2014年4月14日 8:34

回答

  • Option Explicit
    
    Private Sub Command1_Click()
        Picture1.AutoRedraw = False
        Picture1.BackColor = vbYellow
        Picture1.ScaleMode = vbPixels
        Set Picture1.Picture = Me.Icon
        Picture1.Print "漢字"
        
        Picture2.AutoRedraw = True
        Picture2.ScaleMode = vbPixels
        Picture2.BackColor = vbGreen
        Picture2.Refresh
        Picture2.PaintPicture _
            Picture1.Image, 0, 0, 60, 60, 0, 0, 60, 60
    End Sub


    背景を透明化するのではなく、前景のみを描画されては如何でしょうか。

    たとえば上記は、Picture1 への描画内容を Picture2 に転送するコードです。

    上記をそのまま実行すると、Picture2(緑)の左上60ドット四方に
    「黄色背景+アイコン」が描画されるようになっています。

    そして、先頭の「Picture1.AutoRedraw = False」を True に変更すると
    「黄色背景+アイコン+漢字」が描画されます。

    いずれも「黄色背景」が描画されますが、それをを転送したくない場合には、
    最後の行にある PaintPicture の際に、Picture1.Image ではなく
    Picture1.Image を渡すようにします。そうすれば、「アイコン」のみ描画されます。

    • 回答の候補に設定 星 睦美 2014年4月21日 7:08
    • 回答としてマーク 星 睦美 2014年4月23日 4:32
    2014年4月14日 10:32
  • ライブラリはどういった関数を提供しているのでしょうか。
    hDC プロパティを渡しているようなケースではかんたんな実現は難しいかと思われます。

    以下は hDC プロパティを渡している前提で書いていますので、インターフェースが違うのであれば、ひとまず気にしないでください。

    これは BackColor で背景が描かれた上にカメラの画像を描いているので、外から手に入るのは BackColor つきしかないため、透過した画像を得ることはできません。(合成されてしまった絵からはどうしようもできません。理由は BackColor の色の部分が透過すべきなのか、カメラから来たその色なのか判断つかないためです)

    方法として考えられるのは以下のものでしょうか。

    1. カメラからぜったこないような色を背景色に設定し、その色を透過色として扱って抜き取るやり方。
    2. hDC に PictureBox ではなく、API を使って DIB を割り当てた hDC を得るなど、Win32API をバリバリ使える人じゃないと厳しいやり方。
    2014年4月16日 13:35
    モデレータ

すべての返信

  • Option Explicit
    
    Private Sub Command1_Click()
        Picture1.AutoRedraw = False
        Picture1.BackColor = vbYellow
        Picture1.ScaleMode = vbPixels
        Set Picture1.Picture = Me.Icon
        Picture1.Print "漢字"
        
        Picture2.AutoRedraw = True
        Picture2.ScaleMode = vbPixels
        Picture2.BackColor = vbGreen
        Picture2.Refresh
        Picture2.PaintPicture _
            Picture1.Image, 0, 0, 60, 60, 0, 0, 60, 60
    End Sub


    背景を透明化するのではなく、前景のみを描画されては如何でしょうか。

    たとえば上記は、Picture1 への描画内容を Picture2 に転送するコードです。

    上記をそのまま実行すると、Picture2(緑)の左上60ドット四方に
    「黄色背景+アイコン」が描画されるようになっています。

    そして、先頭の「Picture1.AutoRedraw = False」を True に変更すると
    「黄色背景+アイコン+漢字」が描画されます。

    いずれも「黄色背景」が描画されますが、それをを転送したくない場合には、
    最後の行にある PaintPicture の際に、Picture1.Image ではなく
    Picture1.Image を渡すようにします。そうすれば、「アイコン」のみ描画されます。

    • 回答の候補に設定 星 睦美 2014年4月21日 7:08
    • 回答としてマーク 星 睦美 2014年4月23日 4:32
    2014年4月14日 10:32
  • 魔界の仮面弁士さん

     ご回答ありがとうございます。

     投稿した際に細かいことを省略しましたが、Picture1にUSBカメラの画像を出力しています。

     もうひとつのPictureには、異なるサイズの画像を切り出して、出力しようと考えています。

     ただ、カメラの描画処理がメーカー側のライブラリなので、Bitmap描画されたはずですが(ライブ画像をストップ掛けて、保存できた)

     Imageコピーはできなかった。

     backcolorを移ってしまうので、困っています。

     

     

    2014年4月16日 8:37
  • ライブラリはどういった関数を提供しているのでしょうか。
    hDC プロパティを渡しているようなケースではかんたんな実現は難しいかと思われます。

    以下は hDC プロパティを渡している前提で書いていますので、インターフェースが違うのであれば、ひとまず気にしないでください。

    これは BackColor で背景が描かれた上にカメラの画像を描いているので、外から手に入るのは BackColor つきしかないため、透過した画像を得ることはできません。(合成されてしまった絵からはどうしようもできません。理由は BackColor の色の部分が透過すべきなのか、カメラから来たその色なのか判断つかないためです)

    方法として考えられるのは以下のものでしょうか。

    1. カメラからぜったこないような色を背景色に設定し、その色を透過色として扱って抜き取るやり方。
    2. hDC に PictureBox ではなく、API を使って DIB を割り当てた hDC を得るなど、Win32API をバリバリ使える人じゃないと厳しいやり方。
    2014年4月16日 13:35
    モデレータ
  • フォーラム オペレーターの星 睦美です。

    xiaoqishi さん、こんにちは。
    魔界の仮面弁士 さんとAzulean さんの返信を参考にしていただけたと思います。今回は私から[回答としてマーク] をさせていただきました。
    フォーラムでユーザー同士の情報交換がより活発になりますように、次回はxiaqishi さんから回答としてマークいただければ幸いです。では今後ともMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年4月23日 4:39