我的应用程序应该能够将32位图像(RGB + alpha通道)复制到剪贴板,并从剪贴板粘贴这些图像。为此,我计划使用CF_DIBV5
,因为BITMAPV5HEADER
结构有一个字段bV5AlphaMask
。
问题是,对于如何准确地将图像数据存储在剪贴板中,似乎没有达成共识。在做一些测试时,我发现应用程序之间存在一些差异,这使得提出一个通用的解决方案几乎是不可能的。
以下是我的观察结果:
bV5AlphaMask
设置为0。因此,我们必须假设,如果位深度为32,则即使bV5AlphaMask
为0,也存在alpha通道。简而言之,我的基本问题是:关于如何将alpha通道数据存储在剪贴板上,是否有一些官方信息?我特别感兴趣的是,数据是否必须进行预乘。正如你在上面看到的,Word2010和XnView不是预乘,而火狐和Chrome是预乘。但重要的是要知道颜色通道是否应该被预乘。
非常感谢你对此给予了一些启发!
UPDATE 2粘贴到Paint.NET现在可以正常工作。这是由我的代码中的一个错误引起的,如果alpha通道为0,则没有将颜色通道设置为0,即在这种情况下预乘没有正确完成,这似乎混淆了Paint.NET。
IE 10在复制带有alpha通道的PNG到剪贴板时,只是在剪贴板上放了一个24位的CF_DIBV5,但是Paint.NET可以粘贴这个带有alpha通道的位图,所以IE 10必须有另一种格式暴露给剪贴板。也许它暴露了一个使用CFSTR_FILECONTENTS和CFSTR_FILEDESCRIPTOR的PNG。
更新我现在已经用下面的arx描述的方式实现了它,它工作得很好。然而,仍然有两件事让我感到困惑:
1)将alpha通道图像从我的应用程序粘贴到Paint.NET中不会保留alpha通道。图片在Paint.NET中看起来是不透明的。但是,从火狐和Chrome粘贴到Paint.NET效果很好,alpha通道被保留了下来!我已经丢弃了完整的DIBV5,它和我的应用程序是一样的,但它仍然可以与FF和Chrome一起工作,但不能与我的应用程序一起工作,所以它肯定还有其他东西!Firefox和Chrome肯定在做我的应用不能做的其他事情!?
2) Internet Explorer 10也是如此。从IE 10粘贴alpha通道图像到我的应用程序根本不起作用……我得到了一个位深度为24的DIB,也就是说根本没有alpha通道。然而,当从IE 10粘贴到Paint.NET时,alpha通道就在那里!所以这里一定还有更多的东西...
https://stackoverflow.com/questions/15689541
复制相似问题