首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Win32剪贴板和alpha通道图像

Win32剪贴板和alpha通道图像
EN

Stack Overflow用户
提问于 2013-03-29 02:30:09
回答 2查看 4.3K关注 0票数 10

我的应用程序应该能够将32位图像(RGB + alpha通道)复制到剪贴板,并从剪贴板粘贴这些图像。为此,我计划使用CF_DIBV5,因为BITMAPV5HEADER结构有一个字段bV5AlphaMask

问题是,对于如何准确地将图像数据存储在剪贴板中,似乎没有达成共识。在做一些测试时,我发现应用程序之间存在一些差异,这使得提出一个通用的解决方案几乎是不可能的。

以下是我的观察结果:

  1. 当我从Word 2010或XnView复制alpha通道图像到剪贴板时,它是在没有预乘像素数据的情况下存储的。
  2. 当我使用Firefox或Chrome复制图像时,像素数据似乎被alpha channel.
  3. Firefox预乘了设置为0xff000000,而大多数其他应用程序根本不设置它,而是将其保留为0。这很奇怪,因为这些应用程序将DIB放到剪贴板上,这些剪贴板实际上包含最高8位的alpha通道,但它们仍然将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通道就在那里!所以这里一定还有更多的东西...

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15689541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档