gpt4 book ai didi

winforms - 如何将剪贴板中的透明图像粘贴到 C# winforms 应用程序中?

转载 作者:行者123 更新时间:2023-12-04 06:06:38 25 4
gpt4 key购买 nike

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

如何粘贴具有透明度的图像,for example this one , 进入一个 winforms 应用程序并保持透明度?

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

我从谷歌浏览器复制这张图片,它支持多种剪贴板格式,包括 DeviceIndependentBitmapFormat17 .

最佳答案

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 属性设置为库存位图生成了此屏幕截图:

enter image description here

关于winforms - 如何将剪贴板中的透明图像粘贴到 C# winforms 应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11273669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com