Basic 上の色指定とペイントアプリの関係

タグの編集
投稿者 N88-BASIC  (社会人) 投稿日時 2018/5/10 11:57:44
Visual Basic 2017 と Windows 10 (1803) 添付のペイントとの色指定について教えてください。

(1)Visual Basic で描画した画像をクリップボード経由で、ペイントにペースト
   画像には白色(SolidBrush(Color.FromArb(255,255,255,255))で描画した領域を含めています

(2)ペイント上で[選択]→[透明の選択]を実行
 ※透明色の対象となるとおもわれる[色2]は白([色の選択]で確認すると赤(R)、緑(R)、青(U)とも値は 255)

 A.ペイント上に予め画像をファイルから読み込んだ場合は上記白色部が透明にならない。
 B.作成した画像を新規のペイント上でペースト&コピーを行った後は透明となる。
 C.新規ペイント上のツールで描画した場合は透明となる。
 D.読み込み画像は一度、ペースト&コピーを行った場合は透明となる。

上記A.の場合でも透明とする方法をご存知でしたらご教授ください。

尚、Color.FromArb(255,255,255,255)では、アルファ値?(1番目の引数)は0~255まで試してみましたが駄目でした。

以上、よろしくお願いいたします。

PS.

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

   Dim canvas As New Bitmap(MyPicBox.Width, MyPicBox.Height)
   Dim g As Graphics = Graphics.FromImage(canvas)

   Dim Rect1, Rect2 As Rectangle
   '
   Rect1 = New Rectangle(0, 0, MyPicBox.Width, MyPicBox.Height)
   Rect2 = New Rectangle(MyPicBox.Width / 4, MyPicBox.Height / 4, MyPicBox.Width / 2, MyPicBox.Height / 2)

   g.FillRectangle(New SolidBrush(Color.Green), Rect1)
   g.FillEllipse(New SolidBrush(Color.FromArgb(255, 255, 255, 255)), Rect2)
   '
   g.Dispose()
   MyPicBox.Image = canvas

   Clipboard.SetImage(MyPicBox.Image)


投稿者 (削除されました)  () 投稿日時 2018/5/10 12:26:35
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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() 
投稿者 N88-BASIC  (社会人) 投稿日時 2018/5/11 09:55:22
魔界の仮面弁士 さま、ご回答ありがとうございます。

一部、私の説明不足で状況がうまく伝わっていませんでしたが、ご教授いただいたコードで生成した画像で透明色を設定することができました。ただ、ペイントに貼り付ける際に、ペイント上の透明色とする色2の赤(R)、緑(R)、青(U)の各値を211に設定する必要がありました。
言い換えると、色2を前記値に設定しておけば透明にできるので白(Brushes.White)なども描画できました。

また、Dispose なんですが入門書を参考に見様見真似でコーディングをしているので後始末などにあまり気が回っていませんでした。今後は注意したいと思います。初心者の浅知恵ですが、Wordで”拝啓”を入力すると”敬具”が自動で表示されるようになれば便利かも。。

今後ともよろしくお願いいたします。

PS.解決済みですが、質問時の操作は

ペイント(A)<-写真を読み込んでおく
ペイント(B)<-ペイントのツールで描く
画像(1)<-VB上でクリップボードへコピー
画像(2)<画像(1)をペイント(3)にペーストしその画像をペイント(3)上でクリップボードへコピー

上記状態(色2は初期値(赤(R)、緑(R)、青(U)の各値が255)では

ペイント(A)に画像(1)をペーストすると透明にならないが画像(2)は透明になる
ペイント(B)に画像(1)をペーストすると透明になる

以上