とりあえず出来ました。 結局、反転した色から平均をとって、 白、又は黒に近いほうに変換するほうが見やすいようです。 以下のリストになりました。 ご意見がありましたらよろしくお願いいたします。
' @(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 緑のときは白が返されるのですが、この組み合わせだけ見難いです。何か改善の名案がございましたらよろしくお願いいたします。
|