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

解决方案 »

  1.   

        Me.ScaleMode = 3
        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