分類:[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);
}