System.Windows.Clipboardで画像を扱うGetImage()やSetImage()ではアルファチャンネルが保持されないようです。アルファチャンネル付きで画像を扱う場合はGetData()やSetData()でPNG画像形式のデータとして扱うと良いようです。以前にWPF向けのBitmapImageで確認しましたが今回はwinforms用にBitmapオブジェクトで試してみたいと思います。
C#でクリップボードの画像を取得するさんぷる。
プロジェクトの作成 mkdir プロジェクト名 cd プロジェクト名 dotnet new wpf code . ソースコード ファイル名:MainWindow.xaml.cs using System; using System.Coll...
C#でBitmapをクリップボードにコピーしてもアルファチャンネルが保持されない
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())しないのはなんとも気持ち悪いのですが、プログラム終了後もクリップボードに画像データがあるので解放したらまずいような気がしますので、このようなソースコードになりました。
コメント