如何将数据库中的图片(二进制),读出并显示在界面的Image控件?[VB6.0]

如题!

注:数据库中并不是保存的图片路径,而是采用的二进制保存到数据库中的,望各位最好能给出参考代码,谢谢!

摘 要 本文以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

两种方法在使用方面各有所长,读者可以针对自己的情况做出合理的选择。

方法很容易实现的.和楼上的不太一样.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-15
<%
dim pid
pid=trim(request("pid"))
set db = server.createobject("adodb.connection")
db.open conn
sql = "select * from product where product_id =" & pid
set rs = db.execute( sql )
Response.Expires = -9999
response.contenttype = "image"
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
response.binarywrite rs("product_photo")
set rs=nothing
set conn=nothing
%>
以上存为photo.asp
调用的时候:<img src="photo.asp?pid=要显示的图片在数据库中的id" />
第2个回答  2013-08-15
首先,你的图片必须是以二进制输入流的形式保存在数据库中。
其实,从数据库读二进制保存的图片的时候,就是存的一个逆过程,重新再生成一个图片文件而已。
简单给出下面的代码,你研究研究。

import java.io.*;
import java.sql.*;
class GetImg {

private static final String URL = "jdbc:mysql://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private File file = null;

public void blobRead(String outfile, int picID) throws Exception {
FileOutputStream fos = null;
InputStream is = null;
byte[] Buffer = new byte[4096];
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);
pstmt = conn.prepareStatement("select img from imgt where id=?");
pstmt.setInt(1, picID); // 传入要取的图片的ID
rs = pstmt.executeQuery();
rs.next();
file = new File(outfile);
if (!file.exists()) {
file.createNewFile(); // 如果文件不存在,则创建
}
fos = new FileOutputStream(file);
is = rs.getBinaryStream("img");
int size = 0;

while ((size = is.read(Buffer)) != -1) {
// System.out.println(size);
fos.write(Buffer, 0, size);
}
} catch (Exception e) {
System.out.println( e.getMessage());
} finally {
// 关闭用到的资源
fos.close();
rs.close();
pstmt.close();
conn.close();
}
}
public static void main(String[] args) {
try {
GetImg gi=new GetImg();
gi.blobRead("c:/getimgs/1.jpg", 5);
} catch (Exception e) {
System.out.println("[Main func error: ]" + e.getMessage());
}
}
}

is = rs.getBinaryStream("img");
img是数据库中相应的列名,其实和rs.getString()方法差不多,只不过这个方法是读取二进制流的本回答被网友采纳
相似回答