C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

BitBlt(StretchBlt)の透過画像転送について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■93743 / inTopicNo.1)  BitBlt(StretchBlt)の透過画像転送について
  
□投稿者/ saku (1回)-(2020/01/24(Fri) 10:29:17)

分類:[C#] 

2020/01/24(Fri) 10:32:03 編集(投稿者)
OS:Win8.1
IDE:Visual Studio2019

失礼します。
現在Bitblt(StretchBlt)を用いて透過画像の転送を行おうと思っています。
下記URLを参考にして関数を作成したのですが、画像の描画はできますが指定した色で透過が出来ませんでした。
参考URL:http://www1.coralnet.or.jp/mako10/vc/a0037.html

透過できない原因をご教示いただけないでしょうか。
よろしくお願いします。

以下ソースコード
----------------

        [DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport("gdi32.dll", EntryPoint = "CreateBitmap")]
        public static extern IntPtr CreateBitmap(int nWidth, int nHeight, uint cPlanes, uint cBitsPerPel, byte[] lpvBits);

        [DllImport("gdi32.dll", EntryPoint = "SaveDC")]
        public static extern int SaveDC(IntPtr hdc);

        [DllImport("gdi32.dll", EntryPoint = "RestoreDC")]
        public static extern bool RestoreDC(IntPtr hdc, int nSavedDC);

        [DllImport("gdi32", EntryPoint = "SelectObject")]
        public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);

        [DllImport("gdi32", EntryPoint = "DeleteObject")]
        public static extern IntPtr DeleteObject(IntPtr hObject);

        [DllImport("gdi32.dll",EntryPoint = "SetBkColor")]
        public static extern int SetBkColor(IntPtr hdc, int crColor);

        [DllImport("gdi32.dll", EntryPoint = "StretchBlt")]
        public static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
                                             int nWidthDest, int nHeightDest,
                                             IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
                                             TernaryRasterOperations dwRop);


        /// <param name="hdcDest">描画先DC</param>
        /// <param name="nXOrgDest">描画先の開始座標x</param>
        /// <param name="nYOrgDest">描画先の開始座標Y</param>
        /// <param name="nWidthDest">描画先の幅</param>
        /// <param name="nHeightDest">描画先の高さ</param>
        /// <param name="hdcSrc">描画元DC</param>
        /// <param name="nXOrgSrc">描画元の開始座標X</param>
        /// <param name="nYOrgSrc">描画元の開始座標Y</param>
        /// <param name="nWidthSrc">描画元の幅</param>
        /// <param name="nHeightSrc">描画元の高さ</param>
        /// <param name="crTransparent">透過指定する色</param>
        public static void TransparentBlt(IntPtr hdcDest,
                                          int nXOrgDest, int nYOrgDest, int nWidthDest, int nHeightDest,
                                          IntPtr hdcSrc,
                                          int nXOrgSrc, int nYOrgSrc, int nWidthSrc, int nHeightSrc,
                                          Color crTransparent)
        {
            // マスク用DC
            IntPtr hdcMask, hdcRMask;
            // マスク用ビットマップ
            IntPtr hBmpMask, hBmpRMask;
            // 直前の背景色
            int crOld;

            // 引き数で渡せるように色情報を変換
            int intColor = (crTransparent.B * 0x10000) + (crTransparent.G * 0x100) + crTransparent.R;

            hdcMask = CreateCompatibleDC(hdcDest);
            hBmpMask = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, null);
            SaveDC(hdcMask);
            SelectObject(hdcMask, hBmpMask);

            hdcRMask = CreateCompatibleDC(hdcSrc);
            hBmpRMask = CreateCompatibleBitmap(hdcSrc, nWidthSrc, nHeightSrc);
            SaveDC(hdcRMask);
            SelectObject(hdcRMask, hBmpRMask);

            // Mask 作成
            crOld = SetBkColor(hdcSrc, intColor);
            BitBlt(hdcMask, 0, 0, nWidthSrc, nHeightSrc, hdcSrc, nXOrgSrc, nYOrgSrc, SRCCOPY); // マスク作成
            SetBkColor(hdcSrc, crOld);

            // (! Mask) & (Src) 透明色以外の部分のデータ作成
            BitBlt(hdcRMask, 0, 0, nWidthSrc, nHeightSrc, hdcSrc, nXOrgSrc, nYOrgSrc, SRCCOPY);
            BitBlt(hdcRMask, 0, 0, nWidthSrc, nHeightSrc, hdcMask, nXOrgSrc, nYOrgSrc,  0x220326 ); // DSna 

            // 転送
            StretchBlt(hdcDest, nXOrgDest, nYOrgDest, nWidthDest, nHeightDest, hdcMask, 0, 0, nWidthSrc, nHeightSrc, SRCAND);
            StretchBlt(hdcDest, nXOrgDest, nYOrgDest, nWidthDest, nHeightDest, hdcRMask, 0, 0, nWidthSrc, nHeightSrc, SRCINVERT);


            // 解放
            RestoreDC(hdcMask, -1);
            RestoreDC(hdcRMask, -1);

            DeleteObject(hBmpMask);
            DeleteObject(hBmpRMask);
        }

引用返信 編集キー/
■93745 / inTopicNo.2)  Re[1]: BitBlt(StretchBlt)の透過画像転送について
□投稿者/ Hongliang (951回)-(2020/01/24(Fri) 14:20:15)
そもそも、Windows APIにTransparentBlt関数が存在していますが。
引用返信 編集キー/
■93746 / inTopicNo.3)  Re[2]: BitBlt(StretchBlt)の透過画像転送について
□投稿者/ saku (2回)-(2020/01/24(Fri) 14:55:58)
No93745 (Hongliang さん) に返信
> そもそも、Windows APIにTransparentBlt関数が存在していますが。

御返事ありがとうございます。
出来ればgdi32.dllのライブラリのみで対応したい思っています。

情報の記載漏れ申し訳ありません。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ