当前位置:编程学习 > VB >>

新手提问,请帮助一二,谢谢!

各位大牛,新手这厢有礼了!刚学VB,有个问题想请教一下:

有个函数,如下:
函数简介:
获取指定区域的图像,用二进制数据的方式返回

函数原型:
long GetScreenData(x1,y1,x2,y2)

参数定义:
x1:区域的左上X坐标
y1:区域的左上Y坐标
x2:区域的右下X坐标
y2:区域的右下Y坐标

返回值:
返回的是指定区域的二进制颜色数据,每个颜色是4个字节,表示方式为(00RRGGBB)

请问我在VB里如何才能把返回的二进制数据显示为图像呢?

这个dll是在按键精灵论坛找到的,下载地址为:
http://bbs.vrbrothers.com/viewthread.php?tid=118820

再次感谢!希望能详细解答一下,新手实在太新。。。
首先是你为什么要还原图像?

如果你需要图像,可以直接使用截图函数BitBlt,而不是用long GetScreenData(x1,y1,x2,y2)这个函数

用BitBlt抓图很简单。 这个函数是用在客户机的,客户机截图后发往局域网内的一台主机,主机要把传过来的二进制还原成图像。
事情是这样的,我公安局有个朋友这段时间在录入“两实”信息,录入完成后现在进入了查错阶段,因为有上百万条数据要检查,电脑只有几台,我给他写了个小程序自动操作检查、改正错误。但他这个数据库在省厅的服务器里,传输和数据本身也常有一些异常错误,遇到异常错误必须人工处理一下。我就想把客户端目前遇到的错误发送到服务器窗口看看是哪类错误,然后决定是否处理,怎么处理。


在客户机截图后往服务器发送,我不会写,才借助于这个dll里的函数,如果哪位大侠能帮写个完整的截图发送和接收就太感谢了
光是2进制数据怎么还原成图像啊?除非你非常了解该图像的生成格式,否则是无法还原图像的。

正确的办法是把图片截取下来后保存成bmp,或者jpg或者其他的图片文件,然后把图片文件传输到服务器上。这里应该是需要用到WinSock传输吧。
在传输过程中,是把图片文件当2进制文本来读取并传输的,然后传到服务器上再重新把这些2进制信息写入到文件中,形成图片文件 用背包对象发送还原图像二进制数据,查看msdn中的PropertyBag对象的使用方法。

引用楼主 xfzht1 的回复:
返回值:
返回的是指定区域的二进制颜色数据,每个颜色是4个字节,表示方式为(00RRGGBB)

仅处理这个,很容易啊,每个颜色数据就应该是一个像素的颜色值,你这个和VB用的颜色值格式定义一样。
VB调用API函数COPYMEMORY把二进制数据转为LONG值数组。
按你截取区域的长宽像素尺寸循环,每点取一个对应的数组作为颜色画点,就出来画像了。
只是这样的方法缺乏效率,用API函数BitBlt除了抓图也可以画图,而且可以完成这样批量区域式数据的处理,具体的因为我好久不用VB都忘了,你自己查查BitBlt的函数使用说明就有线索了。
引用 6 楼 chinaboyzyq 的回复:
用背包对象发送还原图像二进制数据,查看msdn中的PropertyBag对象的使用方法。


客户端:
Dim PBag As New PropertyBag
Dim b() As Byte

Private Sub Command1_Click()
    Winsock1.Connect "192.168.1.10", 7866
End Sub

Private Sub Command2_Click()
    Call PBag.WriteProperty("abc", Picture1.Picture)
    b = PBag.Contents
    Winsock1.SendData b
End Sub
=======================================================
服务器端:
Dim i As Long
Dim PBag As New PropertyBag
Dim b() As Byte

Private Sub Form_Load()
ws(0).LocalPort = 7866
ws(0).Listen
End Sub

Private Sub Form_Unload(Cancel As Integer)
For i = 0 To ws.UBound
    If ws(i).State <> 0 Then
    ws(i).Close
    End If
Next
End Sub

Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Text2.Text = ws(0).RemoteHostIP
    If ws.Count = 1 Then
        Load ws(1)
        ws(1).Accept requestID
    End If
End Sub

Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    ws(1).GetData (b)
    Call PBag.WriteProperty("abc", b)
    Set Picture1.Picture = PBag.ReadProperty("abc")
End Sub
======================================================================
连接成功后,客户端Command2_Click()发送,服务端报错:实时错误 424 要求对象
点调试黄色标注在Set Picture1.Picture = PBag.ReadProperty("abc")这一行

初学,代码很幼稚,请具体指点一下,谢谢!
引用 8 楼 theforever 的回复:
仅处理这个,很容易啊,每个颜色数据就应该是一个像素的颜色值,你这个和VB用的颜色值格式定义一样。
VB调用API函数COPYMEMORY把二进制数据转为LONG值数组。
按你截取区域的长宽像素尺寸循环,每点取一个对应的数组作为颜色画点,就出来画像了。


请问COPYMEMORY如何把二进制数据转为long值数组?不会。。。。
然后就用for嵌套一个for对每个点画色是吗?怎么画呢?也不会。。。
引用 9 楼 xfzht1 的回复:
Dim PBag As New PropertyBag
Dim b() As Byte

Private Sub Command1_Click()
    Winsock1.Connect "192.168.1.10", 786……


Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  ws(1).GetData (b)
  PBag.Contents = b
  Set Picture1.Picture = PBag.ReadProperty("abc")
End Sub
引用 11 楼 chinaboyzyq 的回复:
Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  ws(1).GetData (b)
  PBag.Contents = b
  Set Picture1.Picture = PBag.ReadProperty("abc")
End Sub


谢谢,但是PBag.Contents = b这句提示类型不匹配,即使删掉前面的Dim b() As Byte或dim b as byte也还是类型不匹配 不知道,系统函数的定义啊,真的不知道 可能是汇编写的GetScreenData 帮顶,多看书,多学习 这个帖子的末尾有你要的答案
http://topic.csdn.net/u/20101007/23/a0a0fff9-ed45-45ed-a7b7-0095f8aa2a8d.html
Winsock1.GetData b '读取缓冲区数据
PBag.Contents = b
Set Picture1.Picture = PBag.ReadProperty("Picture") '设置图片

通过网络传输时数据被自动分包了,一个 PropertyBag.Contents 会有多次 DataArrival 事件触发,你仅仅将第1个包的字节数组赋值给 PropertyBag.Contents 当然会出错了。
需要自己作一下缓存:
a)发送端首先发送一个 Long 值表示字节数组的长度,然后再发送字节数组。
b)接受端
1)先接收到总长的 Long 值,然后定义一个总长的模块级缓存数组,
2)以后每次收到的数据都复制到缓存数组中
3)一直到缓存数组被填满,才用 PropertyBag 转换成图片进行显示。
又是想做游戏验证码远程人肉识别之类的外挂,哎。。。。。。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,