如何在不丢失.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