如何在不丢失.NET中的alpha通道的情况下从剪贴板中获取图像?

我正在尝试从剪贴板保存复制的图像,但它正在丢失其Alpha通道:

Image clipboardImage = Clipboard.GetImage(); string imagePath = Path.GetTempFileName(); clipboardImage.Save(imagePath); 

如果我从PhotoShop或IE / Firefox / Chrome复制32位图像并运行上述代码,则输出会丢失其Alpha通道,而是在黑色背景下保存。

图像保存为PNG,可以包含Alpha通道。

正确的数据似乎在剪贴板中,因为粘贴到其他应用程序(例如PhotoShop)会保留alpha通道。

任何人都可以让我摆脱痛苦吗?

提前致谢!

更新:

 // outputs FALSE Debug.WriteLine(Image.IsAlphaPixelFormat(Clipboard.GetImage().PixelFormat)); 

以上表明,一旦从剪贴板中取出,alpha数据就会丢失。 也许我需要以其他方式从剪贴板中取出它?

而不是调用Clipboard.GetImage() ,尝试调用Clipboard.GetDataObject()

这将返回一个IDataObject,您可以通过调用dataObject.GetFormats()来查询它。 GetFormats()返回Clipboard对象支持的类型格式 – 可以使用更精确的格式来提取数据。

可能像本文建议的那样,在Win32中工作的Clipboard对象只能管理位图,而位图不具有透明/部分透明的alpha通道。 OLE剪贴板更强大,似乎:

  • 介绍
  • 模糊的支持文章
  • 关于Win32剪贴板的一些讨论

然而, netez是我在这个主题上找到的最好的文章。 (小心我自己没有测试过)

图像被保存为位图,透明像素在剪贴板上可见,因此请使用此代码

 Bitmap clipboardImage = Clipboard.GetImage(); clipboardImage.MakeTransparent() string imagePath = Path.GetTempFileName(); clipboardImage.Save(imagePath); 

我只是使用Forms方法。 它不像使用像凯文这样的GetFormat这样的好解决方案告诉我们,但它更快,并且工作安静得很好。

  'Dim bm As BitmapSource = Clipboard.GetImage()'looses alpha channel 'Dim bmS As New WriteableBitmap(bm)'does work but still without alpha information Dim bmF As System.Drawing.Bitmap = System.Windows.Forms.Clipboard.GetImage 'Get working image Dim bmS As BitmapSource = TB.Imaging.WPF.BitmapToWpfBitmapSource(bmF, Me) 'convert Bitmap into BitmapSource Me.Source = bmS