请问一下如何用 getpixel 提取一幅图片中指定区域的象素值,然后把它的值分别存放在R,G,B三个分量中.对这个区域中的所有R,G,B分量分别求它们的平均值?  拜托路过的高手帮忙给指点一下,关键是动态取值然后求它的平均值.先谢谢了```

解决方案 »

  1.   

    既然是取指定区域的象素值,最好不要使用getpixel(效率太低),可以采取先复制指定区域的图象(BitBlt)到一个缓冲绘图设备上下文(DC)中,然后使用GetBitmapBits取得图象的象素值数组,该数组包含了指定区域每个象素的R\G\B分值,接下来循环求得每个象素的分值就可以了.
    当然,如果区域为不规则形状,使用getpixel也可以.
    两种方法返回的R\G\B分值都是一个LONG变量,可通过移位(或模拟移位)运算或使用memcopy转换为BYTE类型即可.
    以GetPixel为例:
    Option ExplicitPrivate Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Sub Form_Load()
        Dim lRGB As Long
        Dim bRGB(1 To 4) As Byte
        Dim bAvg As Byte  '平均值
        
        Me.AutoRedraw = True '注意,必须增加此句,否则得不到正确的RGB值。
        lRGB = GetPixel(Me.hdc, 2, 2) '取窗口坐标(2,2)的象素
        CopyMemory bRGB(1), lRGB, 4
        bAvg = (bRGB(1) + bRGB(2) + bRGB(3) + bRGB(4)) / 4 '计算RGB平均值
        Debug.Print bRGB(1), bRGB(2), bRGB(3), bRGB(4), lRGB, bAvg
    End Sub你可以改变Form的背景颜色试一试,图片的道理是一样的。