vb中有流概念吗?
如何把picture控件中图形数据写成“流”??
Delphi里有一个TMemoryStream,那vb中有什么??
最终目的:是为了网络传输,在网页上显示由vb组件生成的图形。(要求不使用临时文件,直接用二进制数据)

解决方案 »

  1.   

    ADO2.5以上版本有一个ADODB.Stream对象,可以比较容易的创建流,可以查一下相关资料
      

  2.   

    adodb.stream对象材料上传图片或显示SWF的时候都希望得到它的高度和宽度基本原理使用Adodb.Stream读二进制文件然后进行解析,然后返回一数组
    第一个元素为类型(BMP JPG PNG GIF SWF)
    第二个元素为宽度{width}
    第三个元素为高度{height}
    第四个元素为width={width},height={height}式字符串Class qswhImg
     dim aso
     Private Sub Class_Initialize
      set aso=CreateObject("Adodb.Stream")
      aso.Mode=3 
      aso.Type=1 
      aso.Open 
     End Sub
     Private Sub Class_Terminate
      set aso=nothing
     End Sub Private Function Bin2Str(Bin)
      Dim I, Str
      For I=1 to LenB(Bin)
       clow=MidB(Bin,I,1)
       if ASCB(clow)<128 then
        Str = Str & Chr(ASCB(clow))
       else
        I=I+1
        if I <= LenB(Bin) then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
       end if
      Next 
      Bin2Str = Str
     End Function
     
     Private Function Num2Str(num,base,lens)
      'qiushuiwuhen (2002-8-12)
      dim ret
      ret = ""
      while(num>=base)
       ret = (num mod base) & ret
       num = (num - num mod base)/base
      wend
      Num2Str = right(string(lens,"0") & num & ret,lens)
     End Function
     
     Private Function Str2Num(str,base)
      'qiushuiwuhen (2002-8-12)
      dim ret
      ret = 0
      for i=1 to len(str)
       ret = ret *base + cint(mid(str,i,1))
      next
      Str2Num=ret
     End Function
     
     Private Function BinVal(bin)
      'qiushuiwuhen (2002-8-12)
      dim ret
      ret = 0
      for i = lenb(bin) to 1 step -1
       ret = ret *256 + ascb(midb(bin,i,1))
      next
      BinVal=ret
     End Function
     
     Private Function BinVal2(bin)
      'qiushuiwuhen (2002-8-12)
      dim ret
      ret = 0
      for i = 1 to lenb(bin)
       ret = ret *256 + ascb(midb(bin,i,1))
      next
      BinVal2=ret
     End Function
     
     Function getImageSize(filespec) 
      'qiushuiwuhen (2002-9-3)
      dim ret(3)
      aso.LoadFromFile(filespec)
      bFlag=aso.read(3)
      select case hex(binVal(bFlag))
      case "4E5089":
       aso.read(15)
       ret(0)="PNG"
       ret(1)=BinVal2(aso.read(2))
       aso.read(2)
       ret(2)=BinVal2(aso.read(2))
      case "464947":
       aso.read(3)
       ret(0)="GIF"
       ret(1)=BinVal(aso.read(2))
       ret(2)=BinVal(aso.read(2))
      case "535746":
       aso.read(5)
       binData=aso.Read(1)
       sConv=Num2Str(ascb(binData),2 ,8)
       nBits=Str2Num(left(sConv,5),2)
       sConv=mid(sConv,6)
       while(len(sConv)<nBits*4)
        binData=aso.Read(1)
        sConv=sConv&Num2Str(ascb(binData),2 ,8)
       wend
       ret(0)="SWF"
       ret(1)=int(abs(Str2Num(mid(sConv,1*nBits+1,nBits),2)-Str2Num(mid(sConv,0*nBits+1,nBits),2))/20)
       ret(2)=int(abs(Str2Num(mid(sConv,3*nBits+1,nBits),2)-Str2Num(mid(sConv,2*nBits+1,nBits),2))/20)
      case "FFD8FF":
       do 
        do: p1=binVal(aso.Read(1)): loop while p1=255 and not aso.EOS
        if p1>191 and p1<196 then exit do else aso.read(binval2(aso.Read(2))-2)
        do:p1=binVal(aso.Read(1)):loop while p1<255 and not aso.EOS
       loop while true
       aso.Read(3)
       ret(0)="JPG"
       ret(2)=binval2(aso.Read(2))
       ret(1)=binval2(aso.Read(2))
      case else:
       if left(Bin2Str(bFlag),2)="BM" then
        aso.Read(15)
        ret(0)="BMP"
        ret(1)=binval(aso.Read(4))
        ret(2)=binval(aso.Read(4))
       else
        ret(0)=""
       end if
      end select
      ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &""""
      getimagesize=ret
     End Function
    End Class
    使用范例(读某目录下所有图片的宽度):
     set qswh=new qswhImg Set fso = CreateObject("Scripting.FileSystemObject")
     Set f = fso.GetFolder(server.mappath("."))
     Set fc = f.Files
     For Each f1 in fc
      ext=fso.GetExtensionName(f1.path)
      select case ext
      case "gif","bmp","jpg","png":
       arr=qswh.getImageSize(f1.path)
       response.write "<br>" & arr(0) & " " & arr(3) & ":" & f1.name & " width:" & arr(1) & " height:" & arr(2)
      case "swf"
       arr=qswh.getimagesize(f1.path)
       response.write "<br>" & arr(0) & " " & arr(3) & ":" & f1.name & " width:" & arr(1) & " height:" & arr(2)
      end select
      
     Next
     Set fc=nothing
     Set f=nothing
     Set fso=nothing
     Set qswh=nothing
      

  3.   

    组件:"Adodb.Stream"
    有下列方法:
    Cancel 方法
         使用方法如下
         Object.Cancel
         说明:取消执行挂起的异步 Execute 或 Open 方法的调用。
    Close  方法
         使用方法如下
         Object.Close
         :关闭对像
    CopyTo 方法
         使用方法如下
         Object.CopyTo(destStream,[CharNumber])
         说明:将对像的数据复制,destStream指向要复制的对像,CharNumber为可选参数,指要复制的字节数,不选为全部复制。
    Flush  方法
         使用方法如下
         Object.Flush
         说明:
    LoadFromFile 方法
         使用方法如下
         Object.LoadFromFile(FileName)
         说明:将FileName指定的文件装入对像中,参数FileName为指定的用户名。
    Open  方法 
          使用方法如下
          Object.Open(Source,[Mode],[Options],[UserName],[Password])
          说明:打开对像,
          参数说明:Sourece 对像源,可不指定
      Mode 指定打开模式,可不指定,可选参数如下:
        adModeRead  =1
        adModeReadWrite =3
        adModeRecursive =4194304
        adModeShareDenyNone =16
        adModeShareDenyRead =4
        adModeShareDenyWrite =8
        adModeShareExclusive =12
        adModeUnknown  =0
        adModeWrite  =2
      Options 指定打开的选项,可不指定,可选参数如下:
        adOpenStreamAsync =1
        adOpenStreamFromRecord =4
        adOpenStreamUnspecified=-1
      UserName 指定用户名,可不指定。
      Password 指定用户名的密码
    Read  方法
     使用方法如下:
     Object.Read(Numbytes)
     说明:读取指定长度的二进制内容。
     参数说明:Numbytes指定的要读取的找度,不指定则读取全部。ReadText  方法 
     使用方法如下:
     Object.ReadText(NumChars)
     说明:读取指定长度的文本
     参数说明:NumChars指定的要读取的找度,不指定则读取全部。SaveToFile  方法 
     使用方法如下:
     Object.SaveToFile(FileName,[Options])
     说明:将对像的内容写到FileName指定的文件中
     参数说明:FileName指定的文件
        Options 存取的选项,可不指定,可选参数如下:
          adSaveCreateNotExist  =1
          adSaveCreateOverWrite =2SetEOS  方法
     使用方法如下:
     Object.setEOS()
     说明:
    SkipLine  方法
     使用方法如下:
     Object.SkipLine()
     说明:
    Write  方法
     使用方法如下:
     Object.Write(Buffer)
     说明:将指定的数据装入对像中。
     参数说明:Buffer 为指定的要写入的内容。
    WriteText  方法
     使用方法如下:
     Object.Write(Data,[Options])
     说明:将指定的文本数据装入对像中。
     参数说明:Data 为指定的要写入的内容。
               Options 写入的选项,可不指定,可选参数如下:
        adWriteChar  =0
        adWriteLine  =1 
    有下列属性:
     Charset 
     EOS 返回对像内数据是否为空。 LineSeparator 指定换行格式,可选参数有
      adCR   =13
      adCRLF   =-1
      adLF   =10
     
     Mode 指定或返加模式。
     
     Position 指定或返加对像内数据的当前指针。
     
     Size 返回对像内数据的大小。
     
     State 返加对像状态是否打开。
     
     Type 指定或返回的数据类型,可选参数为:
      adTypeBinary  =1
      adTypeText  =2
      

  4.   

    要求是把picture控件中图形数据写成“流”,而不是把文件写成“流”。
    请看明白题目。
    我请教过高手:严格说“Stream”不能称之为“流”。
    我要的是与Delphi里TMemoryStream对应的vb中“流”。
      

  5.   

    这是版主对“流”的一个误解,流其实就是连续的字节而已,你要在Delphi里使用,你首先要搞清楚你将要使用的是DDB还是DIB
      

  6.   

    好像有一大群c/c++的程序员在vb版捣乱……
    vb里怎么来的流?
      

  7.   

    vb当然有流咯
    ado里有,fso里有,xml里也有
    所谓流,就是一串有序列的数据,可以是byte串,也可以是文本串。
    你要是想把picture控件里的数据转换成流,那么最简单的就是依次取得每个pixel的值再写入byte数组。
    当然这是个笨办法。比较聪明点的是利用现有的api函数,这个网上有很多介绍
    比如:http://www.zjonline.com.cn/vbbible/software/program/vb/ccw/htmapi35.htm
    当然我还是推荐用临时文件。毕竟还要传送图片的大小规格。而且一串数据流传到远端再重新还原,vb里也不好作阿!
      

  8.   

    简单,用VB的 savepicture 方法
      

  9.   

    VB就是VB..不要把VC或Delphi中的概念扯到这里来..建议楼主使用Delphi写一Active Control..或标准一Dll..然后再在VB中调用..开发工具重要的在于它的方便性..不是用来和其它的工具比较的~~
      

  10.   

    给大家指明一下我理解的意思:用vb的观点来看,楼主应该是想直接把 picture中的图形数据读为二进制数组,而不用savepicture中转为图片临时文件再从这个文件中读二进制数组的方法。不知二进制数组可否在网页上直接显示,而且网页可否直接接收二进制数组。
      

  11.   

    如果是那样理解,asp里面是有的。以下为网页中显示图片的例子。
    <%
    Buffer = true
    set gs=server.createobject("adodb.recordset")
    gs.open "select Photo from samplephoto where id = " & cint(Request.QueryString("id")),strconn,1,1
    with gs
    if not .eof then
    if not isnull(.Fields(0)) then
    Response.ContentType ="image/pjpeg"
    Response.BinaryWrite .Fields(0)
    end if
    end if
    .close
    end with
    set gs = nothing
    %>
      

  12.   

    ado中的stream对象楼主看不明白的吗?!
      

  13.   

    Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As LongPrivate Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Private PicBets() As Byte
    '枚举简单图形对象
    Private Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End TypePrivate Sub Command1_Click()
    Dim bmpjpg As BITMAP
    Me.CommonDialog1.ShowOpen
    Dim p As String
    p = Me.CommonDialog1.FileName
    Me.Picture1.Picture = LoadPicture(p)'返回二进制图象信息
    GetObject Picture1.Image, Len(bmpjpg), bmpjpg
    ReDim PicBets(bmpjpg.bmHeight * bmpjpg.bmWidth * 3)
    GetBitmapBits Me.Picture1.Image, UBound(PicBets), PicBets(1)
    SetBitmapBits Me.Picture2.Image, UBound(PicBets), PicBets(1)Me.Picture2.Refresh
      

  14.   

    用VB.net写ASP.Net可以轻松搞定,而且可以使用GDI+