選択領域のコピーとペースト C#で簡易画像編集ソフトをつくる(その12)

ここでは範囲選択としてコピーとペーストをやりましたが、背景が透明の場合ペーストをすると背景が透明ではなくなってしまいます。これはどうすることもできないのでしょうか?

以下のようなサンプルプログラムを作成してみました。

ピクチャーボックスの背景に色をつけています。これはここに表示されるビットマップの背景が透明であるかどうかかわかるようにするためです。

そして以下のようなビットマップファイルを作成します。背景は黒、中心に円があり、内部は青(0,0,255)で塗りつぶされています。ファイルの場所は D:\画像\image.bmp です。

サンプルプログラムの各ボタンですが、[読み出し]は D:\画像\image.bmp にあるファイルを読み出します。[青を透明に]は読み出したビットマップの青の部分を透明にします。[保存]は読み出されたファイルを D:\画像\image2.bmpに保存します。そして[クリップボードへ]はビットマップデータをクリップボードにコピーします。[ペースト]はクリップボードにあるデータを右側のピクチャーボックスにペーストします。

ではプログラムの内容をみてみましょう。

それでは実行結果をみてみましょう。[青を透明に]をクリックすると真ん中の青かった部分は透明になります。そしてこれを保存してみると透明になった部分はファイルとして保存されたときも透明なままです。マウスオーバーしてみると真ん中の丸は向こうが透けてみえていることがわかります。

では[クリップボードへ]をクリックしてとなりのピクチャーボックスにコピーしてみましょう。

真ん中の部分が透明になっていません。

またWindowsに標準搭載されているPaintにもペーストしてみましょう。

やっぱりうまくいきません。どうやらこれはClipboard.GetImageメソッドの仕様のようです。

ではどうすることもできないのかというとそうではありません。

このようにするとクリップボードにどのようなフォーマットでデータが格納されているのかを知ることができます。

ここからわかることはBitmapの他にもSystem.Drawing.Bitmapがあるということです。

ButtonPaste_Clickメソッドを書き換えます。これだと上記と同じでうまくいきません。

しかし以下のようにすると透明な部分が灰色のような色に化けてしまうことはありません。

ただしPaintのような他のアプリにペーストする場合は透過情報は失われてしまいます。これは仕様なので仕方がないですね。