既然小方框的边为纯黑色,那么还是比较好找出小方框的位置的。 假设小方框的大小是不变的(我不知道是否会变,长为a,宽为b,单位pt) 1,通过api取点的颜色。2,因为只找左右的两条边,所以从上到下跳越式的搜索(步长<=小方框的宽度b)3,每跳一下,就从左至右的逐像素的搜索,如果找到黑色的点,就上下连续搜索一定数量的点 如果全部为黑色,则证明是一条黑线,说明找到了左边,在左边的基本上,加上宽度,就是右边了。 在此右边还可以用来校验搜索的结果是否正确。4,找到了左右两条边的位置,剩下的就设置你的竖线的位置。 下面给出大体上的代码: GetPixel函数是获取设备指定点颜色值的。 for y = 0 to yMax step b-1for x=0 to xMax if GetPixel(hdc,x,y) =vbBlack then '向上搜索一定数量的点,判断是否全部为黑色 ' '向下搜索一定数量的点,判断是否全部为黑色 ' end ifnextnext
robot类里面有一个方法能获取屏幕像素 robotgetPixelColor(int x, int y) 返回color 对象 然后color 对象里面有一个方法返回rgb值 colorgetRGB()
Bitmap bit = new Bitmap(ScreenPrimaryScreenWorkingAreaWidth, ScreenPrimaryScreenWorkingAreaHeight);
Graphics g = GraphicsFromImage(bit);
gCopyFromScreen(0, 0, 0, 0, ScreenPrimaryScreenWorkingAreaSize);
Color c =bitGetPixel(10, 10);
先屏幕截图,然后取颜色
'使用DIB获取图象,根据他人代码修改,ImgData()中保存的是颜色
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
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type
Private Const DIB_RGB_COLORS = 0 ' color table in RGBs
Private Sub Command1_Click()
Picture1Line (0, 0)-(Picture1Width, Picture1Height), vbRed
Dim BITMAP As BITMAPINFO
Dim ImgData() As Byte'图象颜色
Dim lIndex As Long
Dim i As Long, j As Long, n As Long, t As Long, m
With BITMAP
bmiHeaderbiSize = 40 'BMP30版本
End With
If GetDIBits(Picture1hdc, Picture1PictureHandle, 0, 0, 0, BITMAP, DIB_RGB_COLORS) <> 0 Then '获取图像位图数据大小
ReDim ImgData(BITMAPbmiHeaderbiSizeImage - 1) '重定义数组准备接收位图数据
If GetDIBits(Picture1hdc, Picture1PictureHandle, 0, BITMAPbmiHeaderbiHeight, ImgData(0), BITMAP, DIB_RGB_COLORS) <> 0 Then '正式获取位图数据并将数据存入定义的数组中
'注意数组中颜色分量的存储顺序为:B、G、R(并不是R、G、B),如果你需要对图像进行处理只需改变数组中的数据即可完成
'我试验的位图62x62像素,24色图,3字节存储,每行188字节(一个扫描行的长度必须是4的倍数),这样扫描后共11656字节
' 下面这段程序是将图像亮度变暗(只作为演示,其它效果你可以自己动手做)
'注意:第一条扫描线的位置是从左下角开始
'BITMAPbmiHeaderbiHeight 位图的高度,单位是像素
'BITMAPbmiHeaderbiWidth 位图的宽度,单位是像素
'BITMAPbmiHeaderbiBitCount 图像的颜色位数
'每个像素点的颜色是:(从下往上)
t = ((BITMAPbmiHeaderbiWidth 3 + 3) \ 4) 4 '每行的字节数
For i = 1 To BITMAPbmiHeaderbiHeight
DoEvents
m = t (i - 1)
For j = 1 To BITMAPbmiHeaderbiWidth
n = m + (j - 1) 3
DebugPrint "(" & i & "," & j & ")" & n & ": R=" & ImgData(n) & " G=" & ImgData(n + 1) & " B=" & ImgData(n + 2)
Next
Next
For lIndex = 0 To BITMAPbmiHeaderbiSizeImage - 1
DoEvents
If ImgData(lIndex) - 100 < 0 Then
ImgData(lIndex) = 0
Else
ImgData(lIndex) = ImgData(lIndex) - 100
End If
Next
'
SetDIBits Picture2hdc, Picture2ImageHandle, 0, BITMAPbmiHeaderbiHeight - 1, ImgData(0), BITMAP, DIB_RGB_COLORS '将位图数据写入PICTURE2中
End If
End If
End Sub
GetPixel
>
这是在一个对话框窗口中通过移动鼠标获取颜色值的实现代码,你可以参考:
void CGetRGBDlg::OnMouseMove(UINT nFlags, CPoint point)
{
//获取窗体DC
CDC pDC = GetDC();
//获取颜色值
COLORREF cr = pDC->GetPixel(point);
//提取RGB分量
m_nR = GetRValue(cr);//R值
m_nG = GetGValue(cr);//G值
m_nB = GetBValue(cr);//B值
//显示RGB值
UpdateData(FALSE);
CDialog::OnMouseMove(nFlags, point);
}
如果还不明白我可以给你写个演示代码。
百度HI 找 我
以上就是关于vb如何查找像素读取颜色全部的内容,包括:vb如何查找像素读取颜色、如何在内存DC中调用GetPixel获取像素点颜色值、C#调用GetPixel函数怎么去全屏窗口的某个坐标颜色啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)