2024年3月5日发(作者:)

.

在我们做的许多管理系统中,除了保存大量的文字信息以外,有时候也需要保存一定数量的图片。例如:一个人事管理系统,就需要对每个人的照片进行保存,以便可以方便的对每个人的信息进行处理。

Office中的Access数据库除了保存文本,还可以保存图片,保存图片的数据类型就是"OLE对象":它用来保存 Excel 电子表格、 Word 文档、图形、声音或其他二进制数据。

我现在用一个例子介绍利用vb保存图片的方法,首先我们要介绍vb中处理二进制数据的语句:Put、Get。

Put、Get语句语法如下:

Put [#] filenumber,[recnumber],varname

Get [#] filenumber,[recnumber],varname

Filenumber :必需的。任何有效的文件号

Recnumber :可选的。Variant(Long)。记录号(Random方式的文件)或字节数(Binary方式的文件),指明在此处开始写入

Varname :必需的。包含要写入磁盘的数据的变量名

说明:文件中的第一个记录或字节位于位置1,第二个记录或字节位于位置2,依次类推。若省略recnumber,则将上一个Get或Put语句之后的下一个记录或字节写入。所有用于分界的逗号都必须罗列出来。

现在我们来开始建一个工程,功能是保存一个文档,同时可以保存一幅图片。

首先我们建一个表(表名为photo),字段如下:

字段名 类型 标题

class 类别 文档的分类

photo OLE对象 保存图片文件

photo_ext 文本 图片的扩展名

.

inputtime 日期/时间 文档输入的时间

modifytime 日期/时间 文档的修改时间

subject 文本 文本

现在我们就可以创建finput窗口文件来保存图片。

首先我们要连接我们的数据库,代码如下:

Dim cnstr As String

cnstr = "Provider=.4.0;Persist Security Info=False;" _

amp; "Data Source=" amp; amp; ";Jet OLEDB:database "

cnstr

Location = adUseClient

这段代码可以放在form_load事件中,当做一个多窗口的系统时,最好放到一个模块文件中,这样在其它窗口中都可以调用这个cn连接。

下面是具体的窗口代码:

VERSION 5.00

Object= "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; ""

Object= "{3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0"; ""

Begin finput

BorderStyle = 0 'None

Caption = "文档输入"

.

ClientHeight = 6240

ClientLeft = 0

ClientTop = 0

ClientWidth = 8955

ControlBox = 0 'False

LinkTopic = "Form1"

MDIChild = -1 'True

ScaleHeight = 6240

ScaleWidth = 8955

ShowInTaskbar = 0 'False

Begin Dialog CommonDialog1

Left = 8040

Top = 3840

_ExtentX = 847

_ExtentY = 847

_Version = 393216

End

Begin ox Combo1

Height = 300

Left = 7080

TabIndex = 10

Top = 480

.

Width = 1335

End

Begin dButton Command3

Caption = "关闭"

Height = 375

Left = 5280

TabIndex = 8

Top = 5640

Width = 1095

End

Begin dButton Command2

Caption = "保存"

Height = 375

Left = 2520

TabIndex = 7

Top = 5640

Width = 1095

End

Begin dButton Command1

Caption = "浏览"

Height = 255

Left = 8040

.

TabIndex = 6

Top = 4800

Width = 735

End

Begin x Text2

Height = 375

Left = 1200

TabIndex = 5

Top = 4800

Width = 6375

End

Begin xtBox RichTextBox1

Height = 3615

Left = 1200

TabIndex = 3

Top = 960

Width = 6375

_ExtentX = 11245

_ExtentY = 6376

_Version = 393217

Enabled = -1 'True

TextRTF = $"":0000

.

End

Begin x Text1

Height = 375

Left = 1200

TabIndex = 2

Top = 443

Width = 4695

End

Begin Label4

Caption = "类别"

Height = 255

Left = 6240

TabIndex = 9

Top = 480

Width = 615

End

Begin Label3

Caption = "图片"

Height = 255

Left = 480

TabIndex = 4

Top = 4800

.

Width = 495

End

Begin Label2

Caption = "内容"

Height = 255

Left = 480

TabIndex = 1

Top = 960

Width = 495

End

Begin Label1

Caption = "标题"

Height = 255

Left = 480

TabIndex = 0

Top = 503

Width = 495

End

End

Attribute VB_Name = "finput"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = False

.

Attribute VB_PredeclaredId = True

Attribute VB_Exposed = False

Option Explicit

Private Sub Command1_Click()

tExt =

= "Pictures (*.bmp;*.jpg;*.gif) *.bmp;*.jpg;*.gif" '注意要加引号

en

= me

End Sub

'保存文档的标题,和文档的内容,以及相应的图片

Private Sub Command2_Click()

'判断是否所写的文档是否已经存在数据库了,如果没有,则保存,否则

'不能保存(利用一个"临时rs"查询标题)

Dim subject, sql As String

Dim temp_photo As Stream

Dim rs As New set

Dim rs1 As New set '定义rs1得到类别的id

Dim class_id As Integer '定义得到类别的ID号

subject = Trim() '获得标题

sql = "select * from paper where subject='" + subject + "'"

.

'开始查询

sql, cn, adOpenDynamic, adLockPessimistic

'判断标题是否存在

If Then '文档不存在,开始保存

Dim tempdate As Date '临时时间变量

tempdate = Date

'得到类别的ID

sql = "select cl_number,class from class where class='" + + "'"

sql, cn, adOpenDynamic, adLockPessimistic

rs("class") = rs1("cl_number")

'关闭rs1

rs("subject") = subject

rs("content") =

If Trim() <> "" Then '假如有图片,开始得到图片文件

Dim image_data() As Byte '定义图片保存的变量

.

Open Trim() For Binary As #1

ReDim image_data(LOF(1) - 1)

Get #1, , image_data()

rs("photo").AppendChunk image_data()

End If

rs("inputtime") = tempdate

rs("modifytime") = tempdate

'可能出现保存不成功的现象,所以要考虑可能会出现错误

MsgBox ("保存成功!") '保存成功

= ""

= ""

= "" '此处清空选择图片的框

Else '存在,不能保存,显示错误信息

MsgBox ("文档已经存在,不能保存,请修改!")

End If

'关闭结果集

End Sub

Private Sub Command3_Click()

.

Unload Me

End Sub

Private Sub Form_Load()

= 0

= 0

= + 340

= + 1550

'显示文档的类别

Dim rs As New set

Dim sql As String

sql = "select * from class"

sql, cn, 1, 1

Do While Not '类别不空,则添加进去,对应类别的number为索引

m rs("class")

xt

Loop

If Count <> 0 Then '只有查询结果集不为空时,才能设定显示第一项,利用纪录总数不为0判定

dex = 0 '不能用not 判定,因为现在cursor已经到了最后

End If

.

End Sub

当然,在上面这段代码中,还用到了另一个表(表名为class),字段如下:

字段名 类型 意义

class 文本 文档类别的名称

cl_number 数字 类别的编号

上面的代码可以较好的保存我们的文档和图片,我们还需要显示我们的图片和文档,现在我们还要显示我们的图片,我做了一个显示窗口(fshow),现在我假设数据库中有 一条记录,subject为"ipx协议简介",里面有一个图片(ipx体系结构),窗口代码如下:

VERSION 5.00

Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; ""

Object = "{3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0"; ""

Begin fshow

BorderStyle = 0 'None

Caption = "显示图片"

ClientHeight = 7125

ClientLeft = 0

ClientTop = 0

ClientWidth = 10275

LinkTopic = "Form1"

.

MDIChild = -1 'True

ScaleHeight = 7125

ScaleWidth = 10275

ShowInTaskbar = 0 'False

Begin Frame2

Height = 6615

Left = 2880

TabIndex = 1

Top = 240

Width = 7335

Begin dButton Command1

Caption = "关闭"

Height = 375

Left = 5880

TabIndex = 5

Top = 5880

Width = 1215

End

Begin xtBox RichTextBox1

Height = 4095

Left = 120

TabIndex = 4

.

Top = 1200

Width = 6975

_ExtentX = 12303

_ExtentY = 7223

_Version = 393217

TextRTF = $"":0000

End

Begin Image1

Height = 855

Left = 120

Stretch = -1 'True

Top = 5640

Width = 1095

End

Begin Line4

X1 = 5520

X2 = 5520

Y1 = 5520

Y2 = 6600

End

Begin Line3

X1 = 0

.

X2 = 7320

Y1 = 5520

Y2 = 5520

End

Begin Line2

X1 = 0

X2 = 7320

Y1 = 960

Y2 = 960

End

Begin Label1

BackColor = amp;H80000009amp;

Height = 615

Left = 120

TabIndex = 3

Top = 240

Width = 7095

End

End

Begin Frame1

Height = 6735

Left = 120

.

TabIndex = 0

Top = 240

Width = 2535

Begin ew TreeView1

Height = 6375

Left = 120

TabIndex = 2

Top = 240

Width = 2295

_ExtentX = 4048

_ExtentY = 11245

_Version = 393217

PathSeparator = ""

Style = 7

Appearance = 1

End

End

Begin Line1

BorderColor = amp;H80000001amp;

X1 = 2760

X2 = 2760

Y1 = 120

.

Y2 = 6960

End

End

Attribute VB_Name = "fshow"

Attribute VB_GlobalNameSpace = False

Attribute VB_Creatable = False

Attribute VB_PredeclaredId = True

Attribute VB_Exposed = False

Option Explicit

Private Sub Command1_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim temptop, templeft As Long

= 0

= 0

= + 340

= + 1550

= ( - ) / 2

= ( - ) / 2

.

'显示结果

Dim rs As New set

Dim image_filename As String

Dim temp_image() As Byte

Dim sql As String

sql = "select * from paper where subject=' ipx协议简介'"

sql, cn, adOpenDynamic, adLockReadOnly

n = rs("inputtime")

temp_image() = rs("photo")

image_filename = + "temp." + rs("photo_ext")

'建立临时文件

Open image_filename For Binary As #1

Put #1, , temp_image()

Close #1

e = LoadPicture(image_filename)

'删除临时文件

Kill image_filename

End Sub

上面代码只能显示一条记录,而且需要先赋条件,显示图片用的是先建一个临时文件,然后把二进制数据读到这个文件里,同时要赋给正确的扩展名,然后可以显示图片,注意,要及时删除临时文件。

.

总结:这种方法只是保存图片的其中一种,还有其它保存到数据库的方法,希望大家不断的交流其它的保存图片的方法。