モザイク(T) <TOP>
CreateBrushIndirect LOGBRUSH構造体を定義して論理ブラシを作成
SetRect
RECT構造体の値を設定
FillRect
ブラシで矩形領域を塗りつぶす
DeleteObject オブジェクトを削除
GetDC
デバイスコンテキストのハンドルを取得
ReleaseDC
デバイスコンテキストを解放
本来は、モザイクサイズの2乗に当たる各ポイントの色を取得しそれらの平均値を設定するのですが、面倒なので(^^;)最初のポイントの色のみを、取得設定しています。
参照
'================================================================ '= モザイク(T) '= (Mosaic.bas) '================================================================ #include "Windows.bi" Type LOGBRUSH lbStyle As Long lbColor As Long lbHatch As Long End Type Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Type sColor r As Byte g As Byte b As Byte End Type ' LOGBRUSH構造体を定義して論理ブラシを作成 Declare Function Api_CreateBrushIndirect& Lib "gdi32" Alias "CreateBrushIndirect" (lpLogBrush As LOGBRUSH) ' RECT構造体の値を設定 Declare Function Api_SetRect& Lib "user32" Alias "SetRect" (lpRect As RECT, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&) ' ブラシで矩形領域を塗りつぶす Declare Function Api_FillRect& Lib "user32" Alias "FillRect" (ByVal hDC&, ByRef r As RECT, ByVal hBrush&) ' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define BS_SOLID 0 'ソリッドブラシ Var Shared Text1 As Object Var Shared Edit1 As Object Var Shared Button1 As Object Var Shared Picture1 As Object Var Shared Picture2 As Object Var Shared Bitmap As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 Picture1.Attach GetDlgItem("Picture1") Picture2.Attach GetDlgItem("Picture2") BitmapObject Bitmap '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Bitmap.LoadFile "flower.bmp" Picture1.DrawBitmap Bitmap, 0, 0 Bitmap.DeleteObject End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var hDC As Long Var lb As LOGBRUSH Var rct As RECT Var col As sColor Var hBrush As Long Var Size As Long Var x As Long Var y As Long Var Ret As Long 'デバイスコンテキストのハンドルを取得 hDC = Api_GetDC(Picture2.GethWnd) Size = Val(Edit1.GetWindowText) Picture2.Cls '変換する画像の位置の色を取得 For x = 0 To Picture1.GetWidth - 1 Step Size For y = 0 To Picture1.GetHeight - 1 Step Size col.r = (Picture1.GetPixel(x, y) And &HFF) col.g = ((Picture1.GetPixel(x, y) \ &H100) And &HFF) col.b = ((Picture1.GetPixel(x, y) \ &H10000) And &HFF) '取得した色を設定 lb.lbStyle = BS_SOLID lb.lbColor = RGB(col.r, col.g, col.b) 'ブラシを作成 hBrush = Api_CreateBrushIndirect(lb) 'RECT構造体に値を設定 Ret = Api_SetRect(rct, x, y, x + Size, y + Size) '矩形領域をブラシで塗りつぶす Ret = Api_FillRect(hDC, rct, hBrush) 'オブジェクトを削除 Ret = Api_DeleteObject(hBrush)
CallEvent
Next
Next
'デバイスコンテキストを解放
Ret = Api_ReleaseDC(Picture2.GethWnd, hDC)
End Sub
'================================================================
'=
'================================================================
While 1
WaitEvent
Wend
Stop
End