できました。


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by Hirakin on 2000/10/18 13:34:22

In Reply to: Re: 反転色の求め方について Posted by Uz on 2000/10/17 00:38:36


    とりあえず出来ました。
    結局、反転した色から平均をとって、
    白、又は黒に近いほうに変換するほうが見やすいようです。
    以下のリストになりました。
    ご意見がありましたらよろしくお願いいたします。


    ' @(f)
    '
    ' 機能   : 指定色に対する識別が容易な色(白か黒のみ)を求める
    '
    ' 返値   : 色(Long型)
    '
    ' 引数   : lngColor - BackColor値
    '
    ' 機能説明 : 無し
    '
    ' 備考   : BackColorプロパティに対する、
    ' 識別が容易な白、または黒のForeColorプロパティ用の値を返します
    '
    Private Function CnvWhiteOrBlack(ByVal lngColor As Long) As Long

    Dim lngRed As Long ''赤色の要素
    Dim lngGreen As Long ''緑色の要素
    Dim lngBlue As Long ''青色の要素

    Dim lngRvsRed As Long ''赤(反転値)
    Dim lngRvsGreen As Long ''緑(反転値)
    Dim lngRvsBlue As Long ''青(反転値)

    Dim dblHalf As Double ''3原色のレンジの中間点

    Dim RGBArray(2) As Double ''3原色の配列

    Dim dblRevAVG As Double ''平均値

    ''***********************************************

    dblHalf = 255 / 2

    ''各要素に分解する
    lngRed = (lngColor And &HFF&) ''16進数の赤(0000FF)とAND(論理積)をとる(赤の部分のみを抽出)
    lngGreen = (lngColor And &HFF00&) / (2 ^ 8) ''16進数の緑(00FF00)とAND(論理積)をとり、2の8乗で割る(緑の部分のみを抽出)
    lngBlue = (lngColor And &HFF0000) / (2 ^ 16) ''16進数の青(FF0000)とAND(論理積)をとり、2の16乗で割る(青の部分のみを抽出)

    ''反転した数値を換算する
    lngRvsRed = Abs(255 - lngRed)
    lngRvsGreen = Abs(255 - lngGreen)
    lngRvsBlue = Abs(255 - lngBlue)

    RGBArray(0) = lngRvsRed
    RGBArray(1) = lngRvsGreen
    RGBArray(2) = lngRvsBlue

    ''反転数値の平均(反転色の照度)を求める
    dblRevAVG = AVG(RGBArray())

    ''レンジの中間点を境に、照度と比べて白、または黒に近いほうに変換する
    If dblRevAVG > dblHalf Then
    CnvWhiteOrBlack = vbWhite
    Else
    CnvWhiteOrBlack = vbBlack
    End If

    End Function

    ' @(f)
    '
    ' 機能   : 配列の値から平均値を求める
    '
    ' 返値   : 平均値
    '
    ' 引数   : dblArray() - 配列(分布値)
    '
    ' 機能説明 : なし
    '
    ' 備考   : なし
    '
    Private Function AVG(dblArray() As Double) As Double

    Dim intCnt As Integer
    Dim curTotal As Double
    Dim lngDataCnt As Long

    ''********************************

    curTotal = 0
    lngDataCnt = UBound(dblArray()) + 1

    For intCnt = 0 To lngDataCnt - 1
    curTotal = curTotal + dblArray(intCnt)
    Next

    AVG = curTotal / lngDataCnt

    End Function

    p.s 緑のときは白が返されるのですが、この組み合わせだけ見難いです。何か改善の名案がございましたらよろしくお願いいたします。


記事スレッド一覧