条件付画像拡大縮小転送 <TOP>
StretchBltを使って画像を拡大(縮小)転送してみます。いろいろな条件を選択できるようですが識別しやすい条件のみ選択できるようにしてみました。
ビットマップファイルBitBlt.bmpとBitBlt2.bmpを用意します。例では120×80(ピクセル)
StretchBlt 画像拡大縮小転送
GetDC デバイスコンテキスト取得
ReleaseDC デバイスコンテキスト解放
フォーム設計(Picture1とPicture2を異なるサイズに設定します。)
テストに使用した画像(Picture1、Picture2)
'================================================================ '= 画像の拡大縮小転送 '= (StretchBlt.bas) '================================================================ #include "Windows.bi" ' 拡縮をともなうグラフィックデバイス間のイメージを転送 Declare Function Api_StretchBlt& Lib "gdi32" Alias "StretchBlt" (ByVal hDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal nSrcWidth&, ByVal nSrcHeight&, 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 Bitmap As Object BitmapObject Bitmap 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 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() 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) End Sub '================================================================ '= Picture1の画像をPicture2に条件付でコピーする '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var Ret As Long Ret = API_StretchBLT(hDC2, 0, 0, Picture2.GetWidth, Picture2.GetHeight, hDC1, 0, 0, Picture1.GetWidth, Picture1.GetHeight, 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