从数据中读出图片,把数据保存在字节数组中,怎么才能让图片直接显示到image里面而不经过保存文件就能实现?
谢谢大家

解决方案 »

  1.   

    使用流对象保存和显示图片 
    打开vb6,新建工程。添加两个按钮,一个image控件
    注意:Access中的photo字段类型为OLE对象.
    SqlServer中的photo字段类型为Image'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本
    ‘2.5版本以下不支持Stream对象
    Dim iConcstr As String
    Dim iConc As ADODB.Connection
     '保存文件到数据库中
    Sub s_SaveFile()
        Dim iStm As ADODB.Stream
        Dim iRe As ADODB.Recordset
        Dim iConcstr As String    '读取文件到内容
        Set iStm = New ADODB.Stream
        With iStm
            .Type = adTypeBinary   '二进制模式
            .Open
            .LoadFromFile App.Path + "\test.jpg"
        End With
           '打开保存文件的表
        Set iRe = New ADODB.Recordset
        With iRe
            .Open "select * from img", iConc, 1, 3
            .AddNew         '新增一条记录
            .Fields("photo") = iStm.Read
            .Update
        End With
          '完成后关闭对象
        iRe.Close
        iStm.Close
    End Sub
    Sub s_ReadFile()
        Dim iStm As ADODB.Stream
        Dim iRe As ADODB.Recordset
        '打开表
    Set iRe = New ADODB.Recordset
    ‘得到最新添加的纪录
        iRe.Open "select top 1 * from img order by id desc", iConc, adOpenKeyset, adLockReadOnly
        '保存到文件
        Set iStm = New ADODB.Stream
        With iStm
            .Mode = adModeReadWrite
            .Type = adTypeBinary
            .Open
            .Write iRe("photo")
    ‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误.
            .SaveToFile App.Path & "\test1.jpg"
        End With
           Image1.Picture = LoadPicture(App.Path & "\test1.jpg")
       '关闭对象
        iRe.Close
        iStm.Close
    End Sub
     Private Sub Command1_Click()
    Call s_ReadFile
    End Sub
    Private Sub Command2_Click()
    Call s_SaveFile
    End Sub
    Private Sub Form_Load()
        '数据库连接字符串
        iConcstr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
            ";Data Source=F:\csdn_vb\database\保存图片\access图片\img.mdb"‘下面的语句是连接sqlserver数据库的.
        ‘iConcstr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
    ‘ "User ID=sa;Password=;Initial Catalog=test;Data Source=yang"
        Set iConc = New ADODB.Connection
       iConc.Open iConcstr
    End Sub
     Private Sub Form_Unload(Cancel As Integer)
    iConc.Close
    Set iConc = Nothing
    End Sub
      

  2.   

    读取的
    Private Sub ReadFromDB(RY As String)
    Dim Rst As New ADODB.Recordset
    Dim Mstream As ADODB.Stream
    Dim SQL As StringOn Error Resume Next
    SQL = "select * from ry_manage where rybh='" & RY & "'"
    Set Rst = New ADODB.Recordset
    Rst.CursorLocation = adUseClient
    Rst.Open SQL, Conn, adOpenStatic, adLockReadOnly, adCmdTextIf IsNull(Rst.Fields("pic")) Then img.Picture = LoadPicture(): Exit SubIf Rst.RecordCount = 0 Then
       ShowMsg 1, "  数据库出错,请与系统管理员联系!"
       Rst.Close
       Set Rst = Nothing
       Exit Sub
    End IfSet Mstream = New ADODB.Stream
    Mstream.Type = adTypeBinary
    Mstream.Open
    Mstream.Write Rst.Fields("pic").Value
    Mstream.SaveToFile App.Path & "\tmpImage.gif", adSaveCreateOverWrite
    Mstream.Close
    Set Mstream = Nothing
    img.Picture = LoadPicture(App.Path & "\tmpImage.gif")End Sub保存的
    Private Sub SaveToDB(RY As String)
    Dim Rst As New ADODB.Recordset
    Dim Mstream As New ADODB.Stream
    Dim SQL As String
    Dim MediaName As StringMediaName = Trim$(PicFileName)
    Set Rst = New ADODB.Recordset
    Rst.CursorLocation = adUseClient
    SQL = "select * from ry_manage where rybh='" & RY & "'"
    Rst.Open SQL, Conn, adOpenStatic, adLockPessimistic, adCmdText  Set Mstream = New ADODB.Stream
      Mstream.Type = adTypeBinary
      Mstream.Open
      
      Mstream.LoadFromFile PicFileName
      Rst.Fields("Pic").Value = Mstream.Read
      Rst.UpdateRst.Close
    Set Rst = Nothing
    Set Mstream = NothingEnd Sub
      

  3.   

    前二天论坛上这样的回贴,不保存到文件的方法,现学现卖一下:
    Private Sub Command1_Click()
        '新增一张图片
        Dim Bag As PropertyBag
        Dim Buff() As Byte
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        
        Set Bag = New PropertyBag
        Bag.WriteProperty "Image", Picture1.Image
        ReDim Buff(LenB(Bag.Contents))
        Buff = Bag.Contents
        
        'Set cn = ConnectionToDB
        Set rs = New ADODB.Recordset
        rs.Open "select img from tb_image where 1=0", _
            cn, adOpenKeyset, adLockOptimistic
        rs.AddNew
        rs.Fields("img") = Buff
        rs.Update
        
        Set rs = Nothing
        Set cn = Nothing
        Set Bag = Nothing
        
        MsgBox "OK"
    End SubPrivate Sub Command2_Click()
        '读出全部图片
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim Bag As PropertyBag
        Dim Buff() As Byte
        Dim t
        
        'Set cn = ConnectionToDB
        Set rs = New ADODB.Recordset
        rs.Open "Select * From tb_image", _
            cn, adOpenKeyset, adLockOptimistic
        
        While Not rs.EOF
            Buff = rs.Fields("Img").Value
            Set Bag = New PropertyBag
            Bag.Contents = Buff
            Call Bag.WriteProperty("Image", Buff)
            Set Picture1.Picture = Bag.ReadProperty("Image")
            '延时
            t = Timer
            Do
                DoEvents
            Loop While Timer - t < 1
            rs.MoveNext
            Set Bag = Nothing
        Wend
        set rs=nothing
        set cn=nothing
    End Sub
      

  4.   

    Option Explicit
    Dim mdbConn As New ADODB.Connection
    Dim rs As New ADODB.RecordsetPrivate Sub Command1_Click() '退出
        rs.Close
        mdbConn.Close
        Set rs = Nothing
        Set mdbConn = Nothing
        Unload Me
    End Sub
    Private Sub ViewData()
        Dim B() As Byte
        With rs
            Text1.Text = .Fields(0)
            B = .Fields(1).Value
            Dim Bag As New PropertyBag
            Bag.Contents = B
            Set Picture1.Picture = Bag.ReadProperty("Image")
        End With
    End Sub
    Private Sub Command2_Click() '新增
        Dim Bag As New PropertyBag
        Dim B() As Byte
        Bag.WriteProperty "Image", Picture1.Image
        ReDim B(LenB(Bag.Contents))
        B = Bag.Contents
        rs.AddNew
        rs.Fields(0) = "'" & Replace(Text2, ".", "")
        rs.Fields(1).Value = B
        rs.Update
        Set Bag = Nothing
    End SubPrivate Sub Command3_Click() '浏览
        CommonDialog1.Filter = "BMP文件(*.bmp)|*.bmp|JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif"
        CommonDialog1.ShowOpen
        Picture1.Picture = LoadPicture(CommonDialog1.FileName)
        Text2.Text = CommonDialog1.FileTitle
    End Sub
    Private Sub CmdMoveData_Click(Index As Integer)
        With rs
            Select Case Index
                Case 0      '移到第一条记录
                If Not .BOF Then .MoveFirst
                Case 1      '移到上一条记录
                If .RecordCount > 0 Then
                    If .BOF = False Then .MovePrevious
                    If .BOF = True Then
                        .MoveFirst
                        MsgBox "记录已经移到第一条!", vbOKOnly, Me.Caption
                    End If
                End If
                Case 2      '移到下一条记录
                If .RecordCount > 0 Then
                    If .EOF = False Then .MoveNext
                    If .EOF = True Then
                        .MoveLast
                        MsgBox "记录已经移到最后一条!", vbOKOnly, Me.Caption
                    End If
                End If
                Case 3      '移到最后一条记录
                If .RecordCount > 0 Then
                    If Not .EOF = True Then .MoveLast
                End If
            End Select
            ViewData
            Text3.Text = "第  " & rs.AbsolutePosition & "  条记录"
        End With
    End SubPrivate Sub Command4_Click()
        Dim Bag As New PropertyBag
        Dim B() As Byte
        Bag.WriteProperty "Image", Picture1.Image
        ReDim B(LenB(Bag.Contents))
        B = Bag.Contents
        rs.Fields(1).Value = B
        rs.Update
        Set Bag = Nothing
    End SubPrivate Sub Command5_Click()
            rs.Delete adAffectCurrent
            rs.Update
            CmdMoveData_Click (1)
    End SubPrivate Sub Form_Load()
        Dim lsDbFile As String
        lsDbFile = App.Path & "\db.mdb"
        mdbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & lsDbFile & ";Persist Security Info=False"
        rs.Open "select * from tabtemp", mdbConn, adOpenKeyset, adLockOptimistic
        If rs.RecordCount <> 0 Then
            ViewData
            rs.MoveFirst
            Text3.Text = "第  " & rs.AbsolutePosition & "  条记录"
        End If
    End Sub
      

  5.   

    vbman2003 
    下面这一句抱错呀。
    实时错误'5'
    无效的过程调用或参数
    Bag.Contents = Buff这是怎么回事呀?帮帮我吧
      

  6.   

    应该是可以的,只是要走弯路,避开MS提供的便捷功能,用API来实现,
    问一下,为什么一定要这么做?不如通过文件来得好些
      

  7.   


    我的测试是:
    SQL数据库(ACCESS数据库没测试,但应该没有问题),表中字段类型是image,通过PropertyBag对象写入的图像,再用PropertyBag对象读出
    不知道你的byte数组的数据是那儿来的,如果是直接open文件来的,此方法不行
      

  8.   

    我用的是sql2000的数据库,代码我发出来大家帮我看看,我快晕了。谢谢大家了
    Private Sub Command1_Click()
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim Bag As PropertyBag
        Dim Buff() As Byte
        Set cn = New ADODB.Connection
        cn.ConnectionString = Adodc1.ConnectionString
        cn.Open
        
        Set rs = New ADODB.Recordset
        rs.Open "Select photo From xjsj where bianh ='0789' and enroll_time ='080325091523'", _
            cn, adOpenKeyset, adLockOptimistic    Buff = rs.Fields("photo").Value
            Set Bag = New PropertyBag
            Bag.Contents = Buff
            Call Bag.WriteProperty("Image", Buff)
            Set Picture1.Picture = Bag.ReadProperty("Image")   
        Set rs = Nothing
        Set cn = Nothing
    End Sub