请教一个关于颜色识别的问题

olderboy 2008-03-11 09:19:15
请问一下如何用 getpixel 提取一幅图片中指定区域的象素值,然后把它的值分别存放在R,G,B三个分量中.对这个区域中的所有R,G,B分量分别求它们的平均值? 拜托路过的高手帮忙给指点一下,关键是动态取值然后求它的平均值.先谢谢了```
...全文
64 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
olderboy 2008-03-17
  • 打赏
  • 举报
回复
非常感谢楼上大虾的热心帮助,我的问题已经解决了..谢谢```
lyserver 2008-03-15
  • 打赏
  • 举报
回复
既然是取指定区域的象素值,最好不要使用getpixel(效率太低),可以采取先复制指定区域的图象(BitBlt)到一个缓冲绘图设备上下文(DC)中,然后使用GetBitmapBits取得图象的象素值数组,该数组包含了指定区域每个象素的R\G\B分值,接下来循环求得每个象素的分值就可以了.
当然,如果区域为不规则形状,使用getpixel也可以.
两种方法返回的R\G\B分值都是一个LONG变量,可通过移位(或模拟移位)运算或使用memcopy转换为BYTE类型即可.
以GetPixel为例:
Option Explicit

Private 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的背景颜色试一试,图片的道理是一样的。

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧