条件付画像転送(BitBlt) <TOP>
BitBltを使って画像を転送してみます。いろいろな条件を選択できるようですが識別しやすい条件のみ選択できるようにしてみました。
ビットマップファイルBitBlt.bmpとBitBlt2.bmpを用意します。例では120×80(ピクセル)
BitBlt 画像転送
GetDC デバイス コンテキスト取得
ReleaseDC デバイス コンテキスト解放
テストに使用した画像(Picture1、Picture2)
'================================================================ '= BitBlit(API)で画像転送 '= (BitBlt_API.bas) '================================================================ #include "Windows.bi" ' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー Declare Function Api_BitBlt& Lib "gdi32" Alias "BitBlt" (ByVal hDestDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal dwRop&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define SRCCOPY &HCC0020 'コピー元をコピー #define SRCPAINT &HEE0086 'コピー元とコピー先をOR合成 #define SRCAND &H8800C6 'コピー元とコピー先をAND合成 #define SRCINVERT &H660046 'コピー元とコピー先をXOR合成 #define SRCERASE &H440328 '転送先ビットマップを反転、その結果と転送元ビットマップを論理AND演算子で結合 #define NOTSRCCOPY &H330008 '色を反転して転送 #define NOTSRCERASE &H1100A6 'コピー元の色と、コピー先の色を論理OR演算子で結合し、さらに反転 #define MERGECOPY &HC000CA 'コピー元の色と、コピー先の色を論理AND演算子で結合 #define MERGEPAINT &HBB0226 '反転した転送元ビットマップとパターンビットマップを論理OR演算子で結合 #define PATCOPY &HF00021 '指定のパターンで描画先へコピー #define PATINVERT &H5A0049 'XORで指定のパターンと描画先の色を組み合わせる #define PATPAINT &HF80A09 '指定パターンの色と、コピー元の色を反転した色を論理OR演算子で結合し、結果をコピー先の色と論理OR演算子 #define DSTINVERT &H550009 'コピー先を反転してコピー #define BLACKNESS &H42 'すべてを黒にしてコピー #define WHITENESS &HFF0062 'すべてを白にしてコピー Var Shared Picture1 As Object Var Shared Picture2 As Object Var Shared Radio(4) As Object Var Shared Group1 As Object Var Shared Button1 As Object Var Shared Bitmap As Object BitmapObject Bitmap Var Shared hDC1 As Long Var Shared hDC2 As Long Var Shared WK As Long '================================================================ '= '================================================================ Declare Sub Pic2_BmpSet edecl () Sub Pic2_BmpSet() Bitmap.LoadFile "BitBlt2.bmp" ' Picture2.StretchBitmap Bitmap, 0, 0, Picture2.GetWidth, Picture1.GetHeight Picture2.DrawBitmap Bitmap, 0, 0 Bitmap.DeleteObject End Sub '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() SetReDrawMode 1 Picture1.Attach GetDlgItem("Picture1") Picture2.Attach GetDlgItem("Picture2") For i = 0 To 4 Radio(i).Attach GetDlgItem("Radio" & Trim$(Str$(i + 1))) Radio(i).SetFontSize 14 Next Group1.Attach GetDlgItem("Group1") : Group1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 WK = &HCC0020 Bitmap.LoadFile "BitBlt.bmp" ' Picture1.StretchBitmap Bitmap, 0, 0, Picture1.GetWidth, Picture1.GetHeight Picture1.DrawBitmap Bitmap, 0, 0 Bitmap.DeleteObject hDC1 = Api_GetDC(Picture1.GethWnd) hDC2 = Api_GetDC(Picture2.GethWnd) ShowWindow -1 Cls End Sub '================================================================ '= Picture1の画像をPicture2に条件付でコピーする '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var Ret As Long Ret = Api_BitBlt(hDC2, 0, 0, Picture1.GetWidth, Picture1.GetHeight, hDC1, 0, 0, WK) End Sub '================================================================ '= '================================================================ Declare Sub Radio1_on edecl () Sub Radio1_on() 'Picture1をPicture2に転送 Picture2.Cls WK = &HCC0020 End Sub Declare Sub Radio2_on edecl () Sub Radio2_on() 'Picture1とPicture2をOR合成 Picture2.Cls WK = &HEE0086 Pic2_BmpSet End Sub Declare Sub Radio3_on edecl () Sub Radio3_on() 'Picture1とPicture2をAND合成 Picture2.Cls WK = &H8800C6 Pic2_BmpSet End Sub Declare Sub Radio4_on edecl () Sub Radio4_on() 'Picture1とPicture2をXOR合成 Picture2.Cls WK = &H660008 Pic2_BmpSet End Sub Declare Sub Radio5_on edecl () Sub Radio5_on() 'Picture1を反転して転送 Picture2.Cls WK = &H330009 End Sub '================================================================ '= '================================================================ Declare Sub MainForm_QueryClose edecl (Cancel%, ByVal Mode%) Sub MainForm_QueryClose(Cancel%, ByVal Mode%) Var Ret As Long If Cancel% = 0 Then Ret = Api_ReleaseDC(Picture1.GethWnd, hDC1) Ret = Api_ReleaseDC(Picture2.GethWnd, hDC2) End End If End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End