Project1

标题: 请教一个vb的问题Orz(←模糊标题自重) [打印本页]

作者: 小黄鸡    时间: 2011-11-1 16:10
标题: 请教一个vb的问题Orz(←模糊标题自重)
某字节数组变量储存的是一张图片以二进制读出的数据,有没有办法可以直接将这个字节数组转为stdpicture型啊囧。
存为文件再loadpicture太慢了。
作者: yangff    时间: 2011-11-1 16:10
= =没人告诉你VB6的WinSock会丢包么?
作者: 凌童鞋    时间: 2011-11-1 16:23
喵~~~表示vb无能…
不过我找了份资料给你:读出图片文件到byte数组,然后再得到stdpicture(http://blog.csdn.net/dengyu1997/article/details/617491)
手机不方便给你复制过来,只好给你传送门了……
作者: 小黄鸡    时间: 2011-11-1 18:01
凌童鞋 发表于 2011-11-1 16:23 喵~~~表示vb无能… 不过我找了份资料给你:读出图片文件到byte数组,然后再得到stdpicture(http://blog.csd ...

很感谢,但没看懂,继续求详解。
作者: 熊猫    时间: 2011-11-1 18:51
把数组弄到MemoryStream
然后用方法PictureBox.Image.FromStream
这个可以实现你的要求吧?


熊猫于2011-11-1 18:52补充以下内容:
你用的是.NET吧?


熊猫于2011-11-1 19:11补充以下内容:
        Dim imgPath As String = "E:\20111031200811.jpg"
        Dim imgSize As Long = FileLen(imgPath)
        Dim Bin() As Byte = Nothing
        GetBinX(imgPath, Bin, imgSize, 1)
        Dim IMG As New System.IO.MemoryStream(Bin)
        PictureBox1.Image = Image.FromStream(IMG)
我的代码,成功从数组载入了图片。这个数组我是现读的,这个你不用在乎。
作者: yangff    时间: 2011-11-1 19:13
小黄鸡 发表于 2011-11-1 18:01
很感谢,但没看懂,继续求详解。

把他给你的这段代码复制到VB,然后PictureFromRes(Byte数组)就可以了= = 话说小黄鸡在做什么啊?远程监控?
作者: 小黄鸡    时间: 2011-11-1 21:06
yangff 发表于 2011-11-1 19:13
把他给你的这段代码复制到VB,然后PictureFromRes(Byte数组)就可以了= = 话说小黄鸡在做什么啊?远程监 ...

就是这样= =
手机上看的时候没排版,看不懂= =


小黄鸡于2011-11-1 21:07补充以下内容:
我要获取一个stdpicture的句柄= =
作者: fux2    时间: 2011-11-2 09:58
熊猫 发表于 2011-11-1 18:51
把数组弄到MemoryStream
然后用方法PictureBox.Image.FromStream
这个可以实现你的要求吧?

内啥,这个不可以,我要获取一个stdpicture的句柄。现在自己解决了。
于是求vb字节数组组合的方法,就像ruby的arr1+arr2一样。
[1,2,3]+[2,3,4] = [1,2,3,2,3,4]
作者: 熊猫    时间: 2011-11-2 10:57
fux2 发表于 2011-11-2 09:58
内啥,这个不可以,我要获取一个stdpicture的句柄。现在自己解决了。
于是求vb字节数组组合的方法,就像ru ...

        Dim arr1() As Integer = {1, 2, 3}
        Dim arr2() As Integer = {2, 3, 4}
        Dim list As New List(Of Integer)
        list.AddRange(arr1)
        list.AddRange(arr2)
        Dim new_arr() As Integer = list.ToArray
用链表。
作者: summer92    时间: 2011-11-2 12:09
直接读取 二XX图象就可以了吧,咱也不懂 标记下
作者: 小黄鸡    时间: 2011-11-2 12:23
熊猫 发表于 2011-11-2 10:57
Dim arr1() As Integer = {1, 2, 3}
        Dim arr2() As Integer = {2, 3, 4}
        Dim li ...

new list定义不能
然后请问熊猫君如果换成byte如何组合呢?
作者: 熊猫    时间: 2011-11-2 14:44
本帖最后由 熊猫 于 2011-11-2 14:45 编辑
小黄鸡 发表于 2011-11-2 12:23
new list定义不能
然后请问熊猫君如果换成byte如何组合呢?


        Dim arr1() As Byte = {1, 2, 3}
        Dim arr2() As Byte = {2, 3, 4}
        Dim list As New List(Of Byte)
        list.AddRange(arr1)
        list.AddRange(arr2)
        Dim new_arr() As Byte = list.ToArray
Byte一个道理。这个……话说只有VB.NET才可以用List。。

如果是原始的VB6的话,就写一个Sub或者Function。我不是很确定VB6的Function是否能返回数组~Sub的话注意接收参数要定义为ByRef。
用Ubound函数取前后两个数组长,根据长度ReDim一个新数组。再把两个数组填进去,新数组就是你要的合并后的了。
用VB.NET仿VB6的风格写了一个。
  1.     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  2.         Dim arr1() As Byte = {1, 2, 3}
  3.         Dim arr2() As Byte = {4, 5, 6}
  4.         Dim new_arr() As Byte = Nothing
  5.         Call CombineArraries(arr1, arr2, new_arr)
  6.         For Each bit In new_arr
  7.             Debug.Print(bit)
  8.         Next
  9.     End Sub
  10.     Sub CombineArraries(arr1() As Byte, arr2() As Byte, ByRef new_arr() As Byte)
  11.         ReDim new_arr(UBound(arr1) + UBound(arr2) + 1)
  12.         arr1.CopyTo(new_arr, 0)
  13.         arr2.CopyTo(new_arr, UBound(arr1) + 1)
  14.     End Sub
复制代码
输出了:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
复制代码
不过好像VB6的话,CopyTo也没有,倒是可以用循环替代。
作者: fux2    时间: 2011-11-2 16:19
熊猫 发表于 2011-11-2 14:44
Dim arr1() As Byte = {1, 2, 3}
        Dim arr2() As Byte = {2, 3, 4}
        Dim list As  ...

循环那悲催的效率囧。
vb6没有更直接的方法组合两个byte吗囧rz。
作者: 熊猫    时间: 2011-11-2 17:00
fux2 发表于 2011-11-2 16:19
循环那悲催的效率囧。
vb6没有更直接的方法组合两个byte吗囧rz。

小查了一下,简单对象的数组好像可以使用CopyMemory。21点后回来研究研究……不知道别人有什么好方法~
作者: fux2    时间: 2011-11-2 17:05
熊猫 发表于 2011-11-2 17:00
小查了一下,简单对象的数组好像可以使用CopyMemory。21点后回来研究研究……不知道别人有什么好方法~ ...

当前用的copymemory,但是生成的图有错位颜色也诡异,下标都改过尝试了。
作者: 熊猫    时间: 2011-11-2 17:09
fux2 发表于 2011-11-2 17:05
当前用的copymemory,但是生成的图有错位颜色也诡异,下标都改过尝试了。

你检查一下CopyMemory后数组是否是正好俩拼在一起。是不是一些数据改变了。
如果数据有变化,就是CopyMemory的问题。
如果数据正好是俩数组拼起来的,那就是拼的问题,是不是拼的时候要去除或者添加一些东西。
作者: fux2    时间: 2011-11-2 17:34
本帖最后由 fux2 于 2011-11-2 17:38 编辑
熊猫 发表于 2011-11-2 17:09
你检查一下CopyMemory后数组是否是正好俩拼在一起。是不是一些数据改变了。
如果数据有变化,就是CopyMem ...


于是直接帖代码吧。
客户端的发送部分是这样的.
  1. Private Sub CaptureScreen()
  2.     Dim ScreenHDC   As Long
  3.     Dim size        As Long
  4.     Dim s           As String
  5.     Dim hIconMouse  As Long
  6.     Dim ICONINFO    As ICONINFO
  7.     Dim Pt          As POINTAPI
  8.     On Error GoTo ErrProc
  9.    
  10.     If SendOK Then
  11.         SendOK = False
  12.         '拷屏
  13.         ScreenHDC = GetDC(0)
  14.         WinAPI.BitBlt mHDC, 0, 0, w, h, ScreenHDC, 0, 0, WinAPI.SRCCOPY
  15.         '压缩
  16.         With jpg
  17.             .Quality = 10
  18.             .SampleHDC mHDC, w, h
  19.             buff() = .SaveData()
  20.         End With
  21.         '发送本幅图像数据长度
  22.         size = UBound(buff()) - LBound(buff())
  23.         s = "|SIZE:|" & CStr(size)
  24.         Winsock1.SendData s
  25.         DoEvents
  26.         Sleep 20
  27.         '发送图像数据
  28.         Winsock1.SendData buff()
  29.         DoEvents
  30.         Erase buff()
  31.         WinAPI.ReleaseDC 0, ScreenHDC
  32.     End If
  33.     Exit Sub
  34. ErrProc:
  35.     Winsock1.Close
  36.     Timer1.Enabled = False
  37.     SendOK = True
  38.     ResetNetConnect
  39.     Exit Sub
  40. End Sub
复制代码
接收端代码
  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  2.     On Error Resume Next
  3.     Static p As Long
  4.     Static recv As Boolean
  5.     Dim buff() As Byte
  6.     Dim s As String
  7.     Static lenght As Long
  8.         Winsock1.GetData buff()
  9.         If Not recv Then
  10.             s = StrConv(buff(), vbUnicode)
  11.             If InStr(1, s, "size", vbTextCompare) >= 1 And bytesTotal < 20 Then
  12.                 Dim cmd() As String
  13.                 cmd() = Split(s, "|")
  14.                 lenght = CLng(cmd(2))
  15.                 recv = True
  16.                 p = 1
  17.             End If
  18.         Else
  19.             Put #2, p, buff()
  20.             CopyMemory szfile(p), buff(1), (UBound(buff()) + 1 - LBound(buff()))
  21.             p = p + (UBound(buff()) + 1 - LBound(buff()))
  22.             If p >= lenght Then
  23.                 szfile(0) = &HFF
  24.                 Open App.Path & "/asfd.jpg" For Binary As #1
  25.                 Put #1, , szfile()
  26.                 Close #1
  27.                 Close #2
  28.                 recv = False
  29.                 lenght = 0
  30.                 p = 0
  31.                 myPaintPicture
  32.                 Close
  33.                 Unload Form1
  34.                 End
  35.             End If
  36.         End If
  37.         NewClient = True
  38.     Exit Sub
  39. End Sub
复制代码
这里的#2输出一张qq.jpg,图像正常
asfd是字节数组szfile输出的图像,都是花的= =,貌似哪里有错位,但没发现.
作者: 熊猫    时间: 2011-11-2 17:54
fux2 发表于 2011-11-2 17:34
于是直接帖代码吧。
客户端的发送部分是这样的.接收端代码这里的#2输出一张qq.jpg,图像正常
asfd是字节数 ...

我记得写文件的时候,是按反着的数组顺序写的
例如正常写{1,2,3,4}
写出来是{4,3,2,1}
你拆开成俩数组了(拆开多个也是一个道理)
变成了{1,2}{3,4}
写完变成了
{2,1,4,3}
我感觉是因为这个。
你可以把正常的和花花的都保存出来用16进制编辑器对比一下。
作者: fux2    时间: 2011-11-2 18:08
熊猫 发表于 2011-11-2 17:54
我记得写文件的时候,是按反着的数组顺序写的
例如正常写{1,2,3,4}
写出来是{4,3,2,1}

对比过了,前面貌似全部正常,但最后文件结尾的一段没合进去,原因实在不明。
作者: 熊猫    时间: 2011-11-2 18:18
CopyMemory szfile(Ubound(szfile)), buff(1), (UBound(buff()) + 1 - LBound(buff()))
这样不知道是否可以。。
作者: fux2    时间: 2011-11-2 20:12
本帖最后由 fux2 于 2011-11-2 20:50 编辑
yangff 发表于 2011-11-2 19:40
= =没人告诉你VB6的WinSock会丢包么?


下标改成0,p改成p-1果然好了.
太感谢菲菲姐了,
终于找到卡的原因了。。
是客户端截屏效率太低,求高效截屏方法!(并可高效数据化,要传输)
作者: yangff    时间: 2011-11-3 19:17
这因该算是效率比较高的截屏了。。
你确定是截屏效率低?还是JPG保存效率低?建议简单封包后直接发送?
还有有必要Blt吗?直接Save不行么?Blt效率巨低。。用BLT的话帧率在15左右一般
闪烁什么的可以用双缓冲避免。。但是其实很坑爹的
一个优化是使用Hook,只在重绘时进行录制。
http://www.uvnc.com/index.php
你可以看一下这里面的VNCHooks。。
或者都看看吧。。
如果你要追求高速的话可以看一下
Mirror Driver
其次就是DirectX了这部我不是很熟
在WinDDK的开发包里面有。。不过这种方法很蛋疼。。
如果是Win7的话就用DWMAPI吧
话说远程控制用灰鸽子无误
作者: fux2    时间: 2011-11-4 00:51
yangff 发表于 2011-11-3 19:17
这因该算是效率比较高的截屏了。。
你确定是截屏效率低?还是JPG保存效率低?建议简单封包后直接发送?
还 ...

灰鸽子不会用,网上版本太多,一般都是广域网的。
作者: yangff    时间: 2011-11-5 00:01
http://bbs.kechuang.org/read-kc-tid-26861-fpage-2.html
Try it!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1