私のアプリケーションは、32 ビット イメージ (RGB + アルファ チャネル) をクリップボードにコピーし、これらのイメージをクリップボードから貼り付けることができるはずです。これには、構造体にフィールドがあるCF_DIBV5
ため、使用する予定です。BITMAPV5HEADER
bV5AlphaMask
問題は、画像データをクリップボードに正確に格納する方法について合意が得られていないように見えることです。いくつかのテストを行っているときに、アプリケーション間にいくつかの違いがあり、一般的な解決策を考え出すことはほとんど不可能であることがわかりました.
ここに私の観察があります:
Word 2010 または XnView からアルファ チャネル イメージをクリップボードにコピーすると、ピクセル データを乗算せずに保存されます。
しかし、Firefox または Chrome を使用して画像をコピーすると、ピクセル データがアルファ チャネルで事前に乗算されているように見えます。
Firefox は
bV5AlphaMask
0xff000000 に設定しますが、他のほとんどのアプリケーションはこれをまったく設定せず、0 のままにします。これらのアプリケーションは、実際には上位 8 ビットにアルファ チャネルを含む DIB をクリップボードに配置しますが、それでもbV5AlphaMask
0 に設定するため、これは奇妙です。ビット深度が 32 の場合、bV5AlphaMask
0 であってもアルファ チャネルがあると仮定する必要があります。
簡単に言うと、私の基本的な質問は次のとおりです。アルファ チャネル データをクリップボードに保存する方法に関する公式情報はありますか? データを事前に乗算する必要があるかどうかを調べることに特に興味があります。上記のように、Word 2010 と XnView は事前乗算を行いませんが、Firefox と Chrome は事前乗算を行います。ただし、カラー チャネルを事前に乗算する必要があるかどうかを知ることは非常に重要です。
これに光を当ててくれてありがとう!
更新 2 Paint.NET への貼り付けが正常に機能するようになりました。これは私のコードのバグが原因で、アルファ チャンネルが 0 の場合にカラー チャンネルが 0 に設定されませんでした。つまり、この場合、事前乗算が正しく行われず、Paint.NET が混乱したようです。
Internet Explorer 10 の問題はまだ解決されていません。アルファ チャネルを含む PNG をクリップボードにコピーする場合、IE 10 は 24 ビット CF_DIBV5 をクリップボードに配置するだけですが、Paint.NET はこのビットマップをアルファ チャネル付きで貼り付けることができるため、別の形式が必要です。 IE 10 がクリップボードに公開すること。おそらく、CFSTR_FILECONTENTS と CFSTR_FILEDESCRIPTOR を使用する PNG を公開します。
更新 私は現在、以下のarxで説明されている方法で実装しましたが、かなりうまく機能します。しかし、まだ私を困惑させていることが 2 つあります。
1) アルファ チャネル イメージをアプリから Paint.NET に貼り付けても、アルファ チャネルが保持されません。Paint.NET では画像が不透明に表示されます。ただし、Firefox および Chrome から Paint.NET への貼り付けは完全に機能し、アルファ チャネルは保持されます。完全なDIBV5をダンプしましたが、それは私のアプリと同じですが、それでもFFとChromeでは機能しますが、私のアプリでは機能しないため、何か他のものがあるに違いありません! Firefox と Chrome は、私のアプリがしない何か他のことをしているに違いありません!?
2) Internet Explorer 10 にも同じことが当てはまります。IE 10 からアプリにアルファ チャネル画像を貼り付けても、まったく機能しません... ビット深度が 24 の DIB を取得しています。全て。ただし、IE 10 から Paint.NET に貼り付けると、アルファ チャネルが表示されます。だから、ここにも何かがあるに違いない...