8

注: この質問は、クリップボードへのコピーではなく、クリップボードからの貼り付けに関するものです。クリップボードへのコピーに関する投稿がいくつかありますが、この質問に対処する投稿は見つかりませんでした。

このような透明な画像をwinformsアプリに貼り付けて、透明性を保持するにはどうすればよいですか?

を使用してみSystem.Windows.Forms.GetImage()ましたが、背景が黒いビットマップが生成されます。

DeviceIndependentBitmapこの画像を Google Chrome からコピーしています。Google Chrome は、やなどの複数のクリップボード形式をサポートしていますFormat17

4

2 に答える 2

13

Chrome は、画像を 24bpp 形式でクリップボードにコピーします。これにより、透明度が黒に変わります。クリップボードから 32bpp 形式を取得できますが、DIB 形式を処理する必要があります。System.Drawing には組み込みのサポートはありません。変換を行う小さなヘルパー関数が必要です。

    private Image GetImageFromClipboard() {
        if (Clipboard.GetDataObject() == null) return null;
        if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Dib)) {
            var dib = ((System.IO.MemoryStream)Clipboard.GetData(DataFormats.Dib)).ToArray();
            var width = BitConverter.ToInt32(dib, 4);
            var height = BitConverter.ToInt32(dib, 8);
            var bpp = BitConverter.ToInt16(dib, 14);
            if (bpp == 32) {
                var gch = GCHandle.Alloc(dib, GCHandleType.Pinned);
                Bitmap bmp = null;
                try {
                    var ptr = new IntPtr((long)gch.AddrOfPinnedObject() + 40);
                    bmp = new Bitmap(width, height, width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, ptr);
                    return new Bitmap(bmp);
                }
                finally {
                    gch.Free();
                    if (bmp != null) bmp.Dispose();
                }
            }
        }
        return Clipboard.ContainsImage() ? Clipboard.GetImage() : null;
    }

使用例:

    protected override void OnPaint(PaintEventArgs e) {
        using (var bmp = GetImageFromClipboard()) {
            if (bmp != null) e.Graphics.DrawImage(bmp, 0, 0);
        }
    }

フォームの BackgroundImage プロパティをストック ビットマップに設定して、このスクリーンショットを作成したもの:

ここに画像の説明を入力

于 2012-06-30T12:34:42.193 に答える