既然是取指定区域的象素值,最好不要使用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 '平均值
当然,如果区域为不规则形状,使用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的背景颜色试一试,图片的道理是一样的。