如何在C#winforms应用程序中从剪贴板粘贴透明图像?

问题描述 投票:8回答:2

注意:此问题是关于从剪贴板粘贴而不是复制到剪贴板。有几篇关于复制到剪贴板的文章,但找不到解决此问题的文章。

如何将具有透明度for example this one的图像粘贴到winforms应用程序中并保持透明度?

我尝试使用System.Windows.Forms.GetImage(),但是会产生黑色背景的位图。

我正在从Google Chrome复制该图像,它支持多种剪贴板格式,包括DeviceIndependentBitmapFormat17

winforms image clipboard transparent paste
2个回答
13
投票
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属性设置为股票位图:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9kTlA3TS5wbmcifQ==” alt =“在此处输入图像描述”>

0
投票
Hans Passant的回答很好,但不正确。

Screenshot saved with this code

您需要替换var ptr = new IntPtr((long)gch.AddrOfPinnedObject() + 40);var ptr = new IntPtr((long)gch.AddrOfPinnedObject() + 52);

Screenshot saved with correct code

还需要垂直翻转图像

© www.soinside.com 2019 - 2024. All rights reserved.