注意:此问题是关于从剪贴板粘贴而不是复制到剪贴板。有几篇关于复制到剪贴板的文章,但找不到解决此问题的文章。
如何将具有透明度for example this one的图像粘贴到winforms应用程序中并保持透明度?
我尝试使用System.Windows.Forms.GetImage()
,但是会产生黑色背景的位图。
我正在从Google Chrome复制该图像,它支持多种剪贴板格式,包括DeviceIndependentBitmap
和Format17
。
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 =“在此处输入图像描述”>
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。
还需要垂直翻转图像