投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/10 14:30:59
> (2)ペイント上で[選択]→[透明の選択]を実行
> ※透明色の対象となるとおもわれる[色2]は白([色の選択]で確認すると赤(R)、緑(R)、青(U)とも値は 255

貼り付ける「前」に色を選択していますか? もし貼り付けてから色を変更した場合には、貼った画像をドラッグ移動するなどして、再描画を促す必要があったかと思います。

ちなみに Clipboard.SetImage は "PNG" 形式のデータを生成しませんが、IDataObject を通じて "PNG" 形式のクリップボードデータを用意することは可能です。この場合、貼り付け先のアプリケーションが透過画像形式のデータ転送に対応していれば(たとえば Paint.NET)、透過画像や半透明画像を直接貼り付けることが可能です。

ただしペイントは、"PNG" 形式のクリップボードデータを認識しないので、常に不透明 Bitmap データとして転送されることになると思います。(その代わりにペイントでは [透明の選択] 機能が用意されています)


> Visual Basic での描画イメージは以下の通りです。

ブラシの Dispose 処理が漏れていますよ。


> A.ペイント上に予め画像をファイルから読み込んだ場合は上記白色部が透明にならない。

ファイル化するためのコードが無いようですが…こういう感じだったのでしょうか?
g.Dispose()
canvas.Save("C:\TEMP\TEST.BMP", System.Drawing.Imaging.ImageFormat.Bmp)
MyPicBox.Image = canvas



最初から中央部を透明にしたファイルとして生成したいなら、これでいけます。
Dim canvas As New Bitmap(MyPicBox.Width, MyPicBox.Height)
Using g As Graphics = Graphics.FromImage(canvas)
    'Dim Rect0 = MyPicBox.ClientRectangle  
    Dim Rect1 As New Rectangle(0, 0, MyPicBox.Width, MyPicBox.Height)
    Dim Rect2 As New Rectangle(MyPicBox.Width \ 4, MyPicBox.Height \ 4, MyPicBox.Width \ 2, MyPicBox.Height \ 2)
    g.Clear(Color.Transparent)
    g.FillRectangle(Brushes.Green, Rect1)
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy
    Using b As New SolidBrush(Color.FromArgb(0, Color.White))
        g.FillEllipse(b, Rect2)
    End Using
    canvas.Save("C:\TEMP\TEST.png", System.Drawing.Imaging.ImageFormat.Png)
End Using
Clipboard.SetImage(canvas)
Dim oldImage = MyPicBox.Image
MyPicBox.Image = canvas
'oldImage?.Dispose()