怎样才能实现将图形文件中的每一点像素的RGB转换为单色灰度数据。实现将彩色图形转化成单色图形进行显示。

解决方案 »

  1.   

    try:
    http://search.csdn.net/Expert/topic/574/574322.xml?temp=.5454218
      

  2.   

    循环,用API函数SetPixel设定每一个象素点的RGB值
    声明
    Public Declare Function SetPixel Lib "gdi32" Alias "SetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long返回值
    Long,指定点的实际RGB颜色。如设备不支持指定的准确颜色,则返回的值会与crColor有所不同。如指定的点不能设置,则会返回-1(例如,指定的点可能位于设备场景剪切区外面)。会设置GetLastError参数
    hdc ------------  Long,设备场景的句柄
    x,y ------------  Long,要设置的点,用逻辑坐标表示
    crColor --------  Long,指定像素的新RGB颜色
      

  3.   

    用控件可以,自己写也不难。
    主要是   Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 'Change wffs
    下面的是用setpixel写的,速度比较慢,有兴趣自己用DIB写。不过网上有很多现成的。Option Explicit
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
    Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long'从指定颜色中分离出红色分量
    Function GetRValue&(ByVal rgbColor&)
        GetRValue = rgbColor And &HFF
    End Function'从指定颜色中分离出绿色分量
    Function GetGValue&(ByVal rgbColor&)
        GetGValue = (rgbColor And &HFF00&) / &HFF&
    End Function'从指定颜色中分离出蓝色分量
    Function GetBValue&(ByVal rgbColor&)
        GetBValue = (rgbColor& And &HFF0000) / &HFF00&
    End Function'将场景的某一点的颜色转换为灰色
    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)
        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
    '将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
                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 SubPrivate Sub Form_Load()End Sub
      

  4.   

    用API函数SetPixel或SetPixelV,后者稍快点..
    一个简单的:
    Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As LongPrivate Sub Command1_Click()
    Dim m, n As Single
    For m = 0 To Me.Picture1.ScaleWidth
    For n = 0 To Me.Picture1.ScaleHeight
    SetPixelV Me.Picture1.hdc, m, n, &H808080 '或用RGB(r,g,b)
    Next
    Next
    End Sub
      

  5.   

    Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
    Private Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long用GetDIBits读取图象数据,然后处理,再用SetDIBits显示处理后的图象,速度会比上面的方法快几十倍。
      

  6.   

    我按照helanshan和 laviewpbt的方法都试了一下,没有成功,不知道能不能写得更详细点,源码更好.由于对VB不是很精通,所以麻烦了谢谢!
      

  7.   

    我传一个给你,有setpixel做的,有DIB做的,你自己比较一下速度。
      

  8.   

    Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768
    这是一个G值优先的灰度转换,其实用不着公式,灰度图说白了就RGB三个分量值相等的位图,所以只有256级;
    实际上,按上面公式,你可任意取常数值进行转换,只要保证RGB三个分量常数值之和为32768就行了,不过有一种最快的转灰度算法,就是直接取一个分量值(一般取G值),将另两个改为与它相等,就可完成转换。
    不过,这种算法有一些缺陷,就是对一些偏色图会出问题,比如:若是偏粉红色的图片,取G值转灰度,就会得到一张很暗(甚至全黑)的灰度图。若处理图片并用于保存,建议采用DIB处理,若只是用于屏幕显示,最好采用DDB处理,会快一些。setpixel与getpixel最好不要用,实在太慢,没有实用价值。