Option ExplicitDeclare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long' 函数: GetRValue 功能: 从指定颜色中分离出红色分量
' 入口: rgbColor 指定的颜色
Function GetRValue&(ByVal rgbColor&)
GetRValue = rgbColor And &HFF
End Function' 函数: GetRValue 功能: 从指定颜色中分离出绿色分量
' 入口: rgbColor 指定的颜色
Function GetGValue&(ByVal rgbColor&)
GetGValue = (rgbColor And &HFF00&) / &HFF&
End Function' 函数: GetRValue 功能: 从指定颜色中分离出蓝色分量
' 入口: rgbColor 指定的颜色
Function GetBValue&(ByVal rgbColor&)
GetBValue = (rgbColor& And &HFF0000) / &HFF00&
End Function' 函数: GetRValue 功能: 将场景的某一点的颜色转换为灰色
' 入口: SrcDC 指定的颜色, nx场景中点的X ,ny 场景中点的Y,nMaskColor [可选],该颜色不会改变Sub ChangetoGray(ByVal SrcDC&, ByVal nx&,ByVal ny&,Optional ByVal nMaskColor& = -1)
Dim rgbColor&, Gray&
Dim RValue&, GValue&, BValue&
Dim dl&
rgbColor = GetPixel(SrcDC, nx, ny)
'如果rgbColor=MaskColor,则不改变颜色
If rgbColor = nMaskColor Then GoTo Release:
'获取颜色分量
RValue = GetRValue(rgbColor)
GValue = GetGValue(rgbColor)
BValue = GetBValue(rgbColor)
'重新设置颜色
Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 'Change wffs
rgbColor = RGB(Gray, Gray, Gray)
dl& = SetPixelV(SrcDC, nx, ny, rgbColor)
Release:
rgbColor = 0: Gray = 0
RValue = 0: GValue = 0: BValue = 0
dl = 0
End Sub' 函数: DrawGrayBitmap 功能: 将DC中的某一区域转换为灰度表示
' 入口: hdc DC,nx 区域的起始点X,ny 区域的起始点Y,nWidth 区域的宽度
' nHeight 区域的高度,nMaskColor 屏蔽色Sub DrawGrayBitmap(ByVal hdc&,ByVal nx&,ByVal ny&,ByVal nWidth&, ByVal nHeight&, Optional ByVal nMaskColor& = -1)
Dim i&, j&
'转换成灰色
For i = nx To nWidth
For j = ny To nHeight
'Call ChangetoGray function
ChangetoGray hdc, i, j, nMaskColor
Next j
Next i
End Sub
'以上在类块内声明Private Sub cmdChange_Click()
'转换按钮
DrawGrayBitmap picSrc.hdc, 0, 0, 258, 194
End SubPrivate Sub cmdRestore_Click()
'恢复按钮
picSrc.Cls
End Sub
Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long' 函数: GetRValue 功能: 从指定颜色中分离出红色分量
' 入口: rgbColor 指定的颜色
Function GetRValue&(ByVal rgbColor&)
GetRValue = rgbColor And &HFF
End Function' 函数: GetRValue 功能: 从指定颜色中分离出绿色分量
' 入口: rgbColor 指定的颜色
Function GetGValue&(ByVal rgbColor&)
GetGValue = (rgbColor And &HFF00&) / &HFF&
End Function' 函数: GetRValue 功能: 从指定颜色中分离出蓝色分量
' 入口: rgbColor 指定的颜色
Function GetBValue&(ByVal rgbColor&)
GetBValue = (rgbColor& And &HFF0000) / &HFF00&
End Function' 函数: GetRValue 功能: 将场景的某一点的颜色转换为灰色
' 入口: SrcDC 指定的颜色, nx场景中点的X ,ny 场景中点的Y,nMaskColor [可选],该颜色不会改变Sub ChangetoGray(ByVal SrcDC&, ByVal nx&,ByVal ny&,Optional ByVal nMaskColor& = -1)
Dim rgbColor&, Gray&
Dim RValue&, GValue&, BValue&
Dim dl&
rgbColor = GetPixel(SrcDC, nx, ny)
'如果rgbColor=MaskColor,则不改变颜色
If rgbColor = nMaskColor Then GoTo Release:
'获取颜色分量
RValue = GetRValue(rgbColor)
GValue = GetGValue(rgbColor)
BValue = GetBValue(rgbColor)
'重新设置颜色
Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 'Change wffs
rgbColor = RGB(Gray, Gray, Gray)
dl& = SetPixelV(SrcDC, nx, ny, rgbColor)
Release:
rgbColor = 0: Gray = 0
RValue = 0: GValue = 0: BValue = 0
dl = 0
End Sub' 函数: DrawGrayBitmap 功能: 将DC中的某一区域转换为灰度表示
' 入口: hdc DC,nx 区域的起始点X,ny 区域的起始点Y,nWidth 区域的宽度
' nHeight 区域的高度,nMaskColor 屏蔽色Sub DrawGrayBitmap(ByVal hdc&,ByVal nx&,ByVal ny&,ByVal nWidth&, ByVal nHeight&, Optional ByVal nMaskColor& = -1)
Dim i&, j&
'转换成灰色
For i = nx To nWidth
For j = ny To nHeight
'Call ChangetoGray function
ChangetoGray hdc, i, j, nMaskColor
Next j
Next i
End Sub
'以上在类块内声明Private Sub cmdChange_Click()
'转换按钮
DrawGrayBitmap picSrc.hdc, 0, 0, 258, 194
End SubPrivate Sub cmdRestore_Click()
'恢复按钮
picSrc.Cls
End Sub
Picture1.ScaleMode = 3
Dim m As Long
Dim n As Long
Dim Pi As Long
Dim Red As Long
Dim Blue As Long
Dim Green As Long
Dim YI As Long
For m = 1 To Picture1.ScaleWidth
For n = 1 To Picture1.ScaleHeight
Pi = Picture1.Point(m, n)
Red = Pi Mod 256
Green = ((Pi And &HFF00) / 256&) Mod 256&
Blue = (Pi And &HFF0000) / 65536
YI = (9798 * Red + 19235 * Green + 3735 * Blue) / 32768
YI = RGB(YI, YI, YI)
Picture1.PSet (m, n), YI
Next n
Next m