从数据中读出图片

吴恒 2008-03-24 06:06:43
从数据中读出图片,把数据保存在字节数组中,怎么才能让图片直接显示到image里面而不经过保存文件就能实现?
谢谢大家
...全文
281 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zz005 2008-08-02
  • 打赏
  • 举报
回复
顶下.
xnnhs 2008-04-08
  • 打赏
  • 举报
回复
透彻!
lyjun_311 2008-03-25
  • 打赏
  • 举报
回复
Option Explicit
Dim mdbConn As New ADODB.Connection
Dim rs As New ADODB.Recordset

Private 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 Sub

Private 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 Sub

Private 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 Sub

Private Sub Command5_Click()
rs.Delete adAffectCurrent
rs.Update
CmdMoveData_Click (1)
End Sub

Private 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
zzyong00 2008-03-25
  • 打赏
  • 举报
回复
顶一下
vbman2003 2008-03-25
  • 打赏
  • 举报
回复
前二天论坛上这样的回贴,不保存到文件的方法,现学现卖一下:


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 Sub

Private 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
嗷嗷叫的老马 2008-03-25
  • 打赏
  • 举报
回复
不保存,那就直接读到内存里面,将象素点还原到内存位图就可以了.
程序员老干部 2008-03-25
  • 打赏
  • 举报
回复
读取的
Private Sub ReadFromDB(RY As String)
Dim Rst As New ADODB.Recordset
Dim Mstream As ADODB.Stream
Dim SQL As String

On 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, adCmdText

If IsNull(Rst.Fields("pic")) Then img.Picture = LoadPicture(): Exit Sub

If Rst.RecordCount = 0 Then
ShowMsg 1, " 数据库出错,请与系统管理员联系!"
Rst.Close
Set Rst = Nothing
Exit Sub
End If

Set 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 String

MediaName = 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.Update

Rst.Close
Set Rst = Nothing
Set Mstream = Nothing

End Sub
吴恒 2008-03-25
  • 打赏
  • 举报
回复
我用的是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
vbman2003 2008-03-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuheng66888 的回复:]
vbman2003
下面这一句抱错呀。
实时错误'5'
无效的过程调用或参数
Bag.Contents = Buff

这是怎么回事呀?帮帮我吧
[/Quote]

我的测试是:
SQL数据库(ACCESS数据库没测试,但应该没有问题),表中字段类型是image,通过PropertyBag对象写入的图像,再用PropertyBag对象读出
不知道你的byte数组的数据是那儿来的,如果是直接open文件来的,此方法不行
吴恒 2008-03-25
  • 打赏
  • 举报
回复
我是觉的存成文件再从文件中读出多少走了一些弯路了,所以想从库中直接读出来
xjy2004 2008-03-25
  • 打赏
  • 举报
回复
应该是可以的,只是要走弯路,避开MS提供的便捷功能,用API来实现,
问一下,为什么一定要这么做?不如通过文件来得好些
吴恒 2008-03-25
  • 打赏
  • 举报
回复
vbman2003
下面这一句抱错呀。
实时错误'5'
无效的过程调用或参数
Bag.Contents = Buff

这是怎么回事呀?帮帮我吧
yangao 2008-03-24
  • 打赏
  • 举报
回复
只知道需要保存的
不保存而直接显示的不会
饮水需思源 2008-03-24
  • 打赏
  • 举报
回复
使用流对象保存和显示图片
打开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

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧