2

32 ビットの DIB セクションを作成し、0 以外の値 (FillMemory) を入力して、GDI 関数を使用して描画します。DIB セクションのメモリを調べたところ、4 番目のバイト (アルファ チャネル) ごとに 0 になっていることがわかりました。数年前にこの動作の説明がありましたが、再びそれを見つけることができませんでした (そして、GDI がそのように動作する理由を思い出すことはできません)。GDI関数がアルファチャンネルを0に設定する理由を知っている人はいますか? この動作の仕様はありますか?

アイデアは次のとおりです。

    dib = CreateDIBSection(hdc..., &bytes);
    FillMemory(bytes,...255);
    memdc = CreateCompatibleDC(hdc);
    SelectObject(memdc, bid);
    MoveTo(memdc,...);
    LineTo(memdc,...);
    // look at every pixel in bytes
    // if alpha == 255 then it is undrawn pixel
    // and set alpha + premultiply colors otherwise
    AlphaBlend(hdc, ... memdc,...);

このコードは機能します。ただし、GDI 関数がアルファを 0 に設定することを前提としています。これが「合法的な動作」であることを確認したいと思います。

4

1 に答える 1

4

これは、Windows GDI が最初に設計されてからずっと後に、アルファ ブレンディングが描画機能の一部になったためです。機能を取得するには、 AlphaBlend() (Windows 2000 AFAIK 以降にあります)などの比較的新しい関数を使用する必要があります。

もともと GDI は、マクロで構成された 32 ビットの色値COLORREFにそのような色が含まれるように設計されていました。ご覧のとおり...アルファチャンネルビットだと思っているものはそうではありません。これらは実際には GDI によってゼロに設定されます。透明度は、アルファブレンディングではなく、マスクを使用して達成されました。 RGB0x00bbggrr

GDI のバイナリ形式は、COLORREF私がそのように指定したリンクによって文書化されているため、コードの動作は合法です (MS が文書を変更する可能性が低い場合まで)。

于 2012-10-12T10:31:29.370 に答える