如何从剪贴板中获取图像而不丢失 .NET 中的 Alpha 通道?

问题描述 投票:0回答:5

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

c# .net image png clipboard
5个回答
8
投票

不要打电话给

Clipboard.GetImage()
,而是尝试打电话给
Clipboard.GetDataObject()

这会返回一个 IDataObject,您可以通过调用

dataObject.GetFormats()
来查询它。
GetFormats()
返回剪贴板对象支持的类型格式 - 可能支持更精确的格式,您可以使用它来提取数据。


3
投票

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

但是,netez 是我在该主题上找到的最好的文章。 (注意我自己还没有测试过)


0
投票

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

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

0
投票

我只是使用 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

0
投票

图像剪贴板Image = Clipboard.GetImage();

错误CS0266无法将类型“System.Drawing.Image”隐式转换为“System.Drawing.Bitmap”。存在显式转换(您是否缺少转换?)

© www.soinside.com 2019 - 2024. All rights reserved.