标题:[转]VB 图片转换为Byte()和从Byte()中读取图片的捷径
只看楼主
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
结帖率:100%
 问题点数:0 回复次数:5 
[转]VB 图片转换为Byte()和从Byte()中读取图片的捷径
从某位牛人的 blog 上保存下来的,不过忘了来源了。
向《软件报》投稿的一篇文章 :VB 图片转换为Byte()和从Byte()中读取图片的捷径
没有试过给报社投稿,第一次,投了很久,但还是登出来了,虽然没有稿费,但却很快乐。
文章正文如下:
很多时候,我们需要将图片框中的图片保存到数据库,并从数据库中读取出来。虽然VB中的图片框支持直接绑定数据库存入图片和读取图片的方法,但是很多场合并不能使用绑定来解决问题。于是很多人在进行操作时,都使用了类似以下的方法: 读入图片到图片框后 ,再使用 Open "Picture" For Binary 来打开文件并读入为Byte() 数组。而从数据库读取图片格式时,则需要先将 字段数据读取到 Byte(),再使用 Open "Picture" For Binary 写入到磁盘上的临时文件再使用 LoadPicture 来读取临时文件。写入和读取都是多余的步骤,浪费了时间还留下了临时文件,在图片较大的情况下,对效率的影响相当严重。
是否有更快捷方法来保存图片框图片/读取Byte()中的图片呢?是的,在 VB 下有一个鲜为人知的对象: PropertyBag ,该对象原本是保存 ActiveX 中属性中的数据,并把它写到文件中去。但是我们却能利用它来达到读取图片框图片为Byte() 的目的,请看下列代码:
程序代码:
'假设Form 上已经存在Picture1的控件,并已经设置好图片
Dim PBag As New PropertyBag
Dim B() As Byte
PBag.WriteProperty "Picture", Picture1.Picture
'读取Picture1.Picture 图片并写到 Pbag 容器中
B = PBag.Contents '获取容器Byte 到 B() 数组中
'这时 B 就时我们想要获得的Byte数组
'读取 Byte() 数组内容到 Picture
PBag.Contents = B '指定 PBag容器的内容
'读取容器中的图片
Set Picture1.Picture = PBag.ReadProperty("Picture")
简单的几句代码就可以完成从图片到Byte() ,从Byte()到图片的转换。而且其保存和读取的格式都是使用了原始格式,即:如果你的图片框读入的是Jpg图片格式,则保存的Byte()数组也是该Jpg格式的数组,而非普通位图的数组,所以你也不用担心转换后的数组很没有压缩,很大。
其实:PropertyBag对象并不止于读取保存图片,它就象一个大麻袋,可以藏任何东西,并放到你想放的地方,具体藏什么 ,是由你决定的。你可以将任何对象保存为Byte(),并在需要的时候读出来
如将 ADO 的 RecordSet 对象保存起来,并在需要的时候读取等等……

VB实现图像在数据库的存储与显示
摘 要 本文以VB6与Access97作为开发工具,介绍了图像在数据库中的存储与显示技术。
  关键词 数据库,数据控件,二进制,图像存储,图像显示,ADODB,Recordset
  数据库是数据管理的最新技术,是计算机科学的重要分支,是现代计算机信息系统和计算机应用的基础和核心。在科学技术高速发展的今天,在信息资源无处不在、无处不用,已成为各部门的重要财富的时候,对于从事程序开发的人员来说显得尤为重要。
  如今,对数据库的操作不仅仅满足于对字符和数字的单一操作,图像的存储与显示已显得尤为重要。下面作者将以VB6.0与Access97作为开发工具,分别介绍两种图像显示与存储的方法。
  利用数据控件和数据绑定控件
  利用这种方法,不写或写少量代码就可以构造简单的数据库应用程序,这种方法易于被初学者接受。在举例之前,先把数据绑定功能简要的说明一下,凡是具有DataSource属性的控件都是对数据敏感的,它们都能通过数据控件直接使用数据库里的数据。比如CheckBox Control , ComboBox Comtrol , TextBox Comtrol , PictureBox Control ,Image Comtrol … 因为这种方式涉及到的知识点比较少,也比较容易理解,不多作说明,现直接介绍编程步骤。
  1、从数据库中显示所需要的图片
  首先,添加一个Data数据控件,设置它的DatabaseName和RecordSource属性,
程序代码:
strPath = App.Path
If Right(strPath, 1) <> "\" Then 
 strPath = strPath & "\"
MyData.DatabaseName = strPath & "ExampleDB.mdb" '数据库存地址
MyData.RecordSource = "Info" '表名 

  第二步,添加Image控件用来显示图片,设置它的DataSource和DataField属性。例如本例中: Image1.DataSource="MyData"和Image1.DataField=" MyPhoto" 。然后设置其它具有数据绑定功能的控件用来显示所要的其它内容,经过这两步的操作,运行程序就可以显示你要的数据了。
  2、向数据库中添加需要存储的图片
  首先,利用数据控件所具有的AddNew属性,添加一个按钮,双击后添加如下代码MyData.Recordset.AddNew
  第二步,为Image控件图片指定图片路径Image1.Picture = LoadPicture("图片路径"),经过这两步的操作,就可以向数据库中添加图片了。
  这种方法最简单快捷,要写的代码量很少。但是这种方法在运行速度和灵活性方面有一定的限制,适合于初学者和一些简单的应用,要想灵活多变的显示图像,下面介绍的方法或许更适应您的要求。
  利用编写代码实现图片的存储与显示
  这种方法相对于方法一来说,代码量大,但是它操作灵活,能够满足多样形式下的操作,受到更多编程者的青睐。但是涉及到的知识面相对要多一些,不仅要掌握数据库的操作方法,还要二进制文件的读写作进一步的了解。关于数据库及二进制文件的基本操作很多参考书上都介绍的比较详细,需要时请查阅即可。在编程之前把本部分用到的变量说明如下:
程序代码:
Dim RS As New ADODB.Recordset 
Dim Chunk() As Byte
Const ChunkSize As Integer = 2384
Dim DataFile As Integer, Chunks, Fragment As Integer
Dim MediaTemp As String
Dim lngOffset, lngTotalSize As Long
Dim i As Integer 

  1、从数据库中显示所需要的图片
  第一步首先打开数据库,看有没有要查找的内容,有则继续执行,没有就退出
程序代码:
RS.Source = "select * from Info Where Name='" & sparaName &"';"
RS.ActiveConnection = "UID=;PWD=;DSN=TestDB;"
RS.Open
If RS.EOF Then RS.cCose : Exit Sub 
  第二步,读出长二进制数据即图片数据,把它转换成图片文件,操作过程如下
程序代码:
MediaTemp = strPath & "picturetemp.tmp"
DataFile = 1
Open MediaTemp For Binary Access Write As DataFile
lngTotalSize = RS!MyPhoto.ActualSize
Chunks = lngTotalSize \ ChunkSize
Fragment = lngTotalSize Mod ChunkSize
ReDim Chunk(Fragment)
Chunk() = RS!MyPhoto.GetChunk(Fragment)
Put DataFile, , Chunk()
For i = 1 To Chunks
ReDim Chunk(ChunkSize)
Chunk() = RS!MyPhoto.GetChunk(ChunkSize)
Put DataFile, , Chunk()
Next i
Close DataFile 
  第三步,关闭数据库,这样就可以显示所要的图片了。
程序代码:
RS.Close
If MediaTemp = "" Then Exit Sub
Picture1.Picture = LoadPicture(MediaTemp)
If Picture1.Picture = 0 Then Exit Subj 
  2、向数据库中添加需要存储的图片
  向数据库添加存储的图片是显示图片逆过程,只要掌握了显示图片的操作,存储图片的操作也就迎刃而解了,下面将操作步骤介绍如下
  第一步首先打开数据库,过程如下:
程序代码:
RS.Source = "select * from Info ;"
RS.CursorType = adOpenKeyset
RS.LockType = adLockOptimistic
RS.ActiveConnection = "UID=;PWD=;DSN=TestDB;"
RS.Open 
  第二步,把要存储的图片转换成二进制长文件存入数据库中,操作过程如下
程序代码:
RS.AddNew
DataFile = 1
Open strPathPicture For Binary Access Read As DataFile
FileLen = LOF(DataFile) ' 文件中数据长度
If FileLen = 0 Then : Close DataFile : RS.Close : Exit Sub
Chunks = FileLen \ ChunkSize
Fragment = FileLen Mod ChunkSize
ReDim Chunk(Fragment)
Get DataFile, , Chunk()
RS!MyPhoto.AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For i = 1 To Chunks
 Get DataFile, , Chunk()
 RS!MyPhoto.AppendChunk Chunk()
Next i
Close DataFile 
  第三步,更新纪录后,关闭数据库,就完成了数据图片到数据库的存储。
RS.Update
RS.Close
Set RS = Nothing 
  两种方法在使用方面各有所长,读者可以针对自己的情况做出合理的选择。
搜索更多相关主题的帖子: Byte 捷径 
2008-12-09 17:02
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
测试结果:
程序代码:
'显示图片
Dim tmp() As Byte
Dim PBag As New PropertyBag
tmp = datPrimaryRS.Recordset.Fields("photo")
PBag.Contents = tmp
Set Picture1.Picture = PBag.ReadProperty("Picture")

结果成功

这是对应的保存代码,没有数据定义
程序代码:
'保存图片
PBag.WriteProperty "Picture", picFields(3).Picture
datPrimaryRS.Recordset.Fields("photo") = PBag.Contents
datPrimaryRS.Recordset.Update

保存的数据,用上面的代码成功读出.

如果用OLE方式保存的图片,读取时失败。

授人于鱼,不如授人于渔
早已停用QQ了
2008-12-09 17:05
jxlsp
Rank: 2
等 级:论坛游民
威 望:1
帖 子:37
专家分:52
注 册:2008-4-11
得分:0 
说得很好.
2009-11-10 19:20
Bendis
Rank: 1
来 自:福建厦门
等 级:新手上路
帖 子:47
专家分:0
注 册:2010-4-2
得分:0 
看完了,我试试,有问题再请问高手
2010-05-12 10:45
zzq70
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2012-12-3
得分:0 
没看懂,我水平太低了。
2013-01-14 10:40
luchengqu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-12-22
得分:0 
回复 2楼 风吹过b
谢谢!我试试看!
2013-02-17 16:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-248470-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.093423 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved