C#からクリップボードでアルファチャンネル付き画像を扱う。「Bitmap」

C# コンピュータ
C#

クリップボードの画像に赤い四角を描画するサンプル

namespace ClipImg;

static class Program
{
    /// <summary>
    ///  The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

        // クリップボードからオブジェクトを取り出し
        var obj = Clipboard.GetData("PNG");
        if (obj == null) return;

        // メモリーストリームにキャスト
        var ims = (MemoryStream)obj;

        // メモリーストリームからBitmapオブジェクトを生成
        var bmp = new Bitmap(ims);
        ims.Dispose();

        using (var g = Graphics.FromImage(bmp)) {
            g.FillRectangle(Brushes.Red, 10, 10, 150, 100);
        };

        // メモリストリームを開く
        var oms = new MemoryStream();
        // 変数bmpにクリップボードにコピーするBitmapオブジェクトがセットされているとする
        // BitmapオブジェクトをPNG画像としてメモリストリームに書き込む
        bmp.Save(oms, System.Drawing.Imaging.ImageFormat.Png);
        // クリップボードにメモリストリームをセット
        Clipboard.SetData("PNG", oms);        
    }    
}

GIMPでアルファチャンネル付きカラー画像を用意し全体を選択しDelキーを押し透明にする。
Ctrl+Cでコピーしクリップボードに画像をセットする。

サンプルプログラムで実行するとクリップボード内の画像に赤い資格を描画し、結果をクリップボードにセットする。
GIMPでCtrl+Vでクリップボード画像を貼り付ける。赤い四角のみが不透明でそれ以外は透明になっているので、アルファチャンネルが保持されていることが確認出来る。

MemoryStreamの扱い方が怪しいのですが、クリップボードから受け取ったMemoryStreamオブジェクトはBitmapオブジェクトを生成後、Dispose()で解放しています。クリップボードに受け渡すMemoryStreamオブジェクトは解放せずにそのままにしています。
Streamと名前が付くものをClose(Dispose())しないのはなんとも気持ち悪いのですが、プログラム終了後もクリップボードに画像データがあるので解放したらまずいような気がしますので、このようなソースコードになりました。

コメント