Public Type myRGB
iRed As Integer
iGreen As Integer
iBlue As Integer
End Type
Public Type myHSL
H As Double
S As Double
L As Double
End Type
Function rColorGet(ByVal col As Long) As Long
Dim r As Long
r = col Mod 256
rColorGet = r
End Function
Function gColorGet(ByVal col As Long) As Long
Dim g As Long
g = Int(col / 256) Mod 256
gColorGet = g
End Function
Function bColorGet(ByVal col As Long) As Long
Dim b As Long
b = Int(col / 256 / 256)
bColorGet = b
End Function
Function HSL2RGB色相をRGBに変換(ByVal H, ByVal S, ByVal L) As myRGB
Dim iMax, iMin As Double
Dim r, g, b As Double
If L < 0.5 Then
iMax = 255 * (L + L * S)
iMin = 255 * (L - L * S)
Else
iMax = 255 * (L + (1 - L) * S)
iMin = 255 * (L - (1 - L) * S)
End If
H = H * 360
Select Case True
Case 0 <= H And H < 60
r = iMax
g = (H / 60) * (iMax - iMin) + iMin
b = iMin
Case 60 <= H And H < 120
r = ((120 - H) / 60) * (iMax - iMin) + iMin
g = iMax
b = iMin
Case 120 <= H And H < 180
r = iMin
g = iMax
b = ((H - 120) / 60) * (iMax - iMin) + iMin
Case 180 <= H And H < 240
r = iMin
g = ((240 - H) / 60) * (iMax - iMin) + iMin
b = iMax
Case 240 <= H And H < 300
r = ((H - 240) / 60) * (iMax - iMin) + iMin
g = iMin
b = iMax
Case 300 <= H And H <= 360
r = iMax
g = iMin
b = ((360 - H) / 60) * (iMax - iMin) + iMin
End Select
r = CInt(r)
g = CInt(g)
b = CInt(b)
Dim oreRGB As myRGB
oreRGB.iRed = r
oreRGB.iGreen = g
oreRGB.iBlue = b
HSL2RGB色相をRGBに変換 = oreRGB
End Function
Function Color2HSL(myColor) As myHSL
Dim r, g, b
Dim c
c = myColor
r = rColorGet(c)
g = gColorGet(c)
b = bColorGet(c)
Dim iMax, iMin
iMax = WorksheetFunction.max(r, g, b)
iMin = WorksheetFunction.min(r, g, b)
Dim H, S, L
If iMax = iMin Then
H = 0
ElseIf iMax = r Then
H = 60 * (g - b) / (iMax - iMin)
ElseIf iMax = g Then
H = 60 * (b - r) / (iMax - iMin) + 120
Else
H = 60 * (r - g) / (iMax - iMin) + 240
End If
If H < 0 Then
H = H + 360
End If
If iMax = iMin Then
S = 0
ElseIf (iMax + iMin) / 2 <= 127 Then
S = (iMax - iMin) / (iMax + iMin)
Else
S = (iMax - iMin) / (510 - iMax - iMin)
End If
L = (iMax + iMin) / 2
Dim hsl As myHSL
hsl.H = H / 360
hsl.S = S
hsl.L = L / 255
Color2HSL = hsl
End Function
Function RGB2HSL(ByVal r, ByVal g, ByVal b) As myHSL
Dim iMax, iMin
iMax = WorksheetFunction.max(r, g, b)
iMin = WorksheetFunction.min(r, g, b)
Dim H, S, L
If iMax = iMin Then
H = 0
ElseIf iMax = r Then
H = 60 * (g - b) / (iMax - iMin)
ElseIf iMax = g Then
H = 60 * (b - r) / (iMax - iMin) + 120
Else
H = 60 * (r - g) / (iMax - iMin) + 240
End If
If H < 0 Then
H = H + 360
End If
If iMax = iMin Then
S = 0
ElseIf (iMax + iMin) / 2 <= 127 Then
S = (iMax - iMin) / (iMax + iMin)
Else
S = (iMax - iMin) / (510 - iMax - iMin)
End If
L = (iMax + iMin) / 2
Dim hsl As myHSL
hsl.H = H / 360
hsl.S = S
hsl.L = L / 255
RGB2HSL = hsl
End Function
Function NTSCグレースケール(ByVal r, ByVal g, ByVal b)
Dim rr, gg, bb As Double
rr = 0.298912
gg = 0.586611
bb = 0.114478
Dim Y
Y = (rr * r) + (gg * g) + (bb * b)
NTSCグレースケール = Y
End Function
Function HDTVグレースケール(ByVal r, ByVal g, ByVal b)
Dim rr, gg, bb, X As Double
rr = 0.222015
gg = 0.706655
bb = 0.07133
X = 2.2
r = (r ^ X) * rr
g = (g ^ X) * gg
b = (b ^ X) * bb
Dim Y
Y = (r + g + b) ^ (1 / X)
HDTVグレースケール = Y
End Function
Function NTSCグレースケール2(ByVal r, ByVal g, ByVal b)
Dim rr, gg, bb As Double
rr = 0.222015
gg = 0.706655
bb = 0.07133
Dim Y
Y = (rr * r) + (gg * g) + (bb * b)
NTSCグレースケール2 = Y
End Function
Function NTSCグレースケール3(ByVal r, ByVal g, ByVal b)
Dim rr, gg, bb As Double
rr = 0.1
gg = 0.85
bb = 0.05
Dim Y
Y = (rr * r) + (gg * g) + (bb * b)
NTSCグレースケール3 = Y
End Function
Function HSLのL変化でY輝度(ByVal H, ByVal S, ByVal L) As myRGB
Dim i As Integer
Dim kijun
kijun = CInt(L * 255)
For i = L To 255
iRGB = HSL2RGB色相をRGBに変換(H, S, i / 255)
Next
End Function
Function LOnlyChangeLだけ変更グレースケール版( _
ByVal H, ByVal S, ByVal LStart, Frequency, myStart, myEnd, CRange As ChangeRange, gType As String) As myRGB()
LStart = LStart * 255
Dim Y
Dim ikko
Dim iStart, iEnd, iStep
If CRange = All Then
ikko = 255 / Frequency
iStart = 0
iStep = 1
iEnd = 255
ElseIf CRange = UP Then
ikko = (255 - myStart) / (Frequency + 1)
iStart = LStart
iStep = 1
iEnd = 255
ElseIf CRange = DOWN Then
ikko = myStart / (Frequency + 1)
iStart = LStart
iStep = -1
iEnd = 0
End If
Dim cnt, i As Integer
cnt = 0
Dim iRGB As myRGB
Dim RGBs() As myRGB
For i = iStart To iEnd Step iStep
iRGB = HSL2RGB色相をRGBに変換(H, S, i / 255)
Select Case gType
Case "HDTV"
Y = HDTVグレースケール(iRGB.iRed, iRGB.iGreen, iRGB.iBlue)
Case "NTSC"
Y = NTSCグレースケール(iRGB.iRed, iRGB.iGreen, iRGB.iBlue)
Case "NTSC2"
Y = NTSCグレースケール2(iRGB.iRed, iRGB.iGreen, iRGB.iBlue)
Case "NTSC3"
Y = NTSCグレースケール3(iRGB.iRed, iRGB.iGreen, iRGB.iBlue)
End Select
If CRange = DOWN Then
If Y <= myStart - (ikko * (cnt + 1)) Then
ReDim Preserve RGBs(cnt)
RGBs(cnt) = iRGB
cnt = cnt + 1
End If
ElseIf CRange = UP Then
If Y >= ikko * (cnt + 1) + myStart Then
ReDim Preserve RGBs(cnt)
RGBs(cnt) = iRGB
cnt = cnt + 1
End If
Else
If Y >= ikko * (cnt + 0) Then
ReDim Preserve RGBs(cnt)
RGBs(cnt) = iRGB
cnt = cnt + 1
End If
End If
Next
LOnlyChangeLだけ変更グレースケール版 = RGBs
End Function
Public Function Color2GrayScale(myColor, gType As String) As Double
Dim Y
Dim r, g, b As Integer
r = rColorGet(myColor)
g = gColorGet(myColor)
b = bColorGet(myColor)
Y = RGB2GrayScale(r, g, b, gType)
Color2GrayScale = Y
End Function
Public Function RGB2GrayScale(r, g, b, gType As String) As Double
Dim Y
Select Case gType
Case "HDTV"
Y = HDTVグレースケール(r, g, b)
Case "NTSC"
Y = NTSCグレースケール(r, g, b)
Case "NTSC2"
Y = NTSCグレースケール2(r, g, b)
Case "NTSC3"
Y = NTSCグレースケール3(r, g, b)
End Select
RGB2GrayScale = Y
End Function