请说详细点,谢谢!

解决方案 »

  1.   

    取每点的RGB值,把三个分量相加再除以3,得到的数值作为新的三个分量的值,再写回去。
      

  2.   

    http://community.csdn.net/Expert/topic/4402/4402446.xml?temp=.1621515
      

  3.   

    转为灰度图
    http://www.54uc.com/phppost9/php71190.htm直接显示灰度图
    http://www.study888.com/computer/pro/vb/jiqiao/200505/34183.html
      

  4.   

    这种问题你上baidu或者google搜索一下,就可以了,好多文章。
      

  5.   

    图片里的每个点叫做一个象素,每个象素都有R,G,B三个色彩分量(暂不讨论Alpha通道),而当R=G=B时,此象素就为不同程度的灰色.从0到255.
    转化为灰度图就是把R,G,B三个分量相加,再取平均值设为新的RGB值;
    取得RGB值有两种方法:一种是GetPixel,速度较慢;另一种是用GetBitmapBits等相应函数获取,速度较快,但编码有些麻烦.
      

  6.   

    ' 函数: GetRValue 功能: 将场景的某一点的颜色转换为灰色
    ' 入口: SrcDC       指定的颜色, nx场景中点的X ,ny  场景中点的Y,nMaskColor  [可选],该颜色不会改变Private 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  屏蔽色Private 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
      

  7.   

    Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
      

  8.   

    DrawGrayBitmap picTest.hdc, 0, 0, picTest.Width, picTest.Height
      

  9.   

    回复人: province_(雍昊) ( ) 信誉:100  2006-1-13 12:09:09  得分: 0  
     
     
       
    取每点的RGB值,把三个分量相加再除以3,得到的数值作为新的三个分量的值,再写回去。  
    =====================================
    呵呵,兄台象我一样,懒人一个。
    rgb相加再除3的方法是简单方便,但出来的灰度图会很难看的。
    要效果好一点的,用上面的 Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 公式吧。
    至于具体方法,按速度要求选择吧。
      

  10.   

    逐点处理,编成计算像素的颜色值
    用PSet或SetPixelV都很慢
    建议用GetDIBits取得图像数据我以前写的用VB作DIB图像处理的文章(其中的连接早已失效):
    http://dev.csdn.net/develop/article/20/20442.shtmWallesCai(曾经沧海难为水,除却巫山不是云。此情可待成追忆,只是当时已惘然。)也写过几个例子:
    http://blog.csdn.net/WallesCai/
    彩色转灰度的心理公式
    Gray = R*0.299 + G*0.587 + B*0.114但是该公式用的是浮点运算,一般化为整数运算,如楼上的
    Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768
      

  11.   

    去 http://www.eightbird.com/ 看一下 typhoonGraph.ocx 控件是否适合用。
      

  12.   

    来了UP下吧
    同意 zyl910(910:分儿,我又来了!)的观点,使用DIB方法,可以提高N倍速度