8

我正在尝试从剪贴板保存复制的图像,但它正在丢失其 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 数据,它就会丢失。也许我需要以其他方式将其从剪贴板中取出?

4

4 回答 4

8

而不是打电话Clipboard.GetImage(),试着打电话Clipboard.GetDataObject()

这将返回一个 IDataObject,您可以依次调用dataObject.GetFormats(). GetFormats()返回剪贴板对象支持的类型格式 - 可能支持更精确的格式,您可以使用它来提取数据。

于 2009-06-15T22:45:55.607 回答
3

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

但是,netez是我找到的关于该主题的最佳文章。(注意我自己没有测试过)

于 2009-06-15T22:57:02.817 回答
0

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

Bitmap clipboardImage = Clipboard.GetImage();
clipboardImage.MakeTransparent()
string imagePath = Path.GetTempFileName();
clipboardImage.Save(imagePath);
于 2009-06-15T22:23:24.600 回答
0

我只是使用表单方法。它不是GetFormat像 Kevin 告诉我们的那样使用的好解决方案,但它更快速,而且工作安静。

  '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
于 2011-10-25T13:53:01.707 回答