表示できる色に最も近いカラー値を取得(U)          <TOP>


GetPixel 指定された座標のピクセルのRGB値を取得
GetNearestColor 指定のカラー値に対して、デバイスが表示できる色に最も近いカラー値を取得
CreateCompatibleDC 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
DeleteDC 指定されたデバイスコンテキストを削除
GetDC 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放

 

「実行」ボタンクリックで24ビットの画像をトレースし、そのGetNearestColorの値をPicture2に(1ビット)描画しています。
Picture1上のマウス指定位置のRGB値と、その時のGetNearestColor値を表示させています。

 

'================================================================
'= 表示できる色に最も近いカラー値を取得(U)
'=    (GetNearestColor2.bas)
'================================================================
#include "Windows.bi"

' 指定された座標のピクセルのRGB値を取得
Declare Function Api_GetPixel& Lib "gdi32" Alias "GetPixel" (ByVal hDC&, ByVal X&, ByVal Y&)

' 指定のカラー値に対して、デバイスが表示できる色に最も近いカラー値を取得
Declare Function Api_GetNearestColor& Lib "gdi32" Alias "GetNearestColor" (ByVal hDC&, ByVal crColor&)

' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&)

' 指定されたデバイスコンテキストを削除
Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

Var Shared MainForm As Object
Var Shared Text(3) As Object
Var Shared Picture(1) As Object
Var SHared Button1 As Object
Var Shared Bitmap As Object
BitmapObject Bitmap

MainForm.Attach GethWnd
For i = 0 To 3
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1)))
    If i < 2 Then
        Text(i).SetFontSize 14
        Picture(i).Attach GetDlgItem("Picture" & Trim$(Str$(i + 1)))
    Else
        Text(i).SetFontSize 12
    End If
Next i
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared hDC As Long

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Bitmap.LoadFile "flower.bmp"
    Picture(0).DrawBitmap Bitmap , 0, 0
    Bitmap.DeleteObject

    'Picture1のデバイスコンテキストを取得
    hDC = Api_GetDC(Picture(0).GethWnd)
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var DotCol As String
    Var lColor As Long
    Var rgbR As Integer
    Var rgbG As Integer
    Var rgbB As Integer
    Var nDC As Long
    Var x As Integer
    Var y As Integer
    Var Ret As Long

    Picture(1).Cls

    'デバイスコンテキストを作成
    nDC = Api_CreateCompatibleDC(hDC)

    For x = 0 To Picture(0).GetWidth - 1
        For y = 0 To Picture(0).GetHeight - 1
            'マウス指定位置のRGB値を取得
            lColor = Api_GetPixel(hDC, x, y)

            rgbR = lColor And &HFF
            rgbG = (lColor And &HFF00) / 256
            rgbB = (lColor And &HFF0000) / 65536

            If Api_GetNearestColor(nDC, RGB(rgbR, rgbG, rgbB)) = &HFFFFFF Then
                Picture(1).Pset(x, y), 15
            Else
                Picture(1).Pset(x, y), 0
            End If
        Next y
    Next x

    '解放
    Ret = Api_DeleteDC(nDC)
End Sub

'================================================================
'=
'================================================================
Declare Sub Picture1_MouseMove edecl (ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Sub Picture1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Var DotCol As String
    Var lColor As Long
    Var rgbR As Integer
    Var rgbG As Integer
    Var rgbB As Integer
    Var nDC As Long
    Var Ret As Long

    'デバイスコンテキストを作成
    nDC = Api_CreateCompatibleDC(hDC)

    'マウス指定位置のRGB値を取得
    lColor = Api_GetPixel(hDC, X, Y)

    'Picture1指定座標と同位置に赤のドットで描画
    Picture(1).Pset(X, Y), 5

    rgbR = lColor And &HFF
    rgbG = (lColor And &HFF00) / 256
    rgbB = (lColor And &HFF0000) / 65536

    'RGBを表示
    DotCol = "(" & Format$(rgbR, "###") & "," & Format$(rgbG, "###") & "," & Format$(rgbB, "###") & ")"
    Text(0).SetWindowText DotCol

    '最も近いカラー値を取得
    Text(1).SetWindowText "&&H" & Hex$(Api_GetNearestColor(nDC, RGB(rgbR, rgbG, rgbB)))

    '解放
    Ret = Api_DeleteDC(nDC)
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()
    Var Ret As Long

    Ret = Api_ReleaseDC(Picture(0).GethWnd, hDC)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End