我正在尝试从剪贴板保存复制的图像,但它正在丢失其 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()
返回剪贴板对象支持的类型格式 - 可能支持更精确的格式,您可以使用它来提取数据。
图像被保存为位图,其中透明像素在剪贴板上可见,因此请使用此代码
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
图像剪贴板Image = Clipboard.GetImage();
错误CS0266无法将类型“System.Drawing.Image”隐式转换为“System.Drawing.Bitmap”。存在显式转换(您是否缺少转换?)