如何显示数据库中以 OLE 对象方式存储的 JPEG 图片

发表于:2007-06-30来源:作者:点击数: 标签:
在 ASP 中, 我们经常需要在 Web 页面上显示以二进制方式保存在 数据库 中的图片。 一般的图片显示没有什么问题, 因为这方面的文章已经很多了, 我就不再阐述。 但有时候数据库中的图片是通过其他办公软件输入的, 或者通过其他方式, 比如在 Access 中直接
在 ASP 中, 我们经常需要在 Web 页面上显示以二进制方式保存在数据库中的图片。 一般的图片显示没有什么问题, 因为这方面的文章已经很多了, 我就不再阐述。 但有时候数据库中的图片是通过其他办公软件输入的, 或者通过其他方式, 比如在 Aclearcase/" target="_blank" >ccess 中直接添加。 这时, 图片以 OLE 对象的方式保存在数据库中, 在图片真实内容的前面, 还保存了一些其他的信息, 比如图片的路径和文件名,等等。 如果我们还用一般的输出方式的话, 就会出错, 导致图片不能显示。

幸好 jpeg, bmp 等图象格式中在图片内容的开头都有一个 SOI marker,这个 marker 对于 jpeg 来说是 FFD8, 而对于 bmp 是 424D. 这样一来, 我们只要找到这个 marker 的位置, 就可以忽略前面的内容而直接从这里开始输出图片。以 SQL server 为例,代码如下:

<%
@#-------------------------------------------------------------------------------------
@# 函数:function ShowJpegField(field)
@# 作者: inelm(Archimond【阿克蒙德】) from csdn
@# Date: 2003-12-6 更新
@# 功能: 取得保存 jpeg 图片的字节数组中的 SOI marker 开始位置, 并从该位置输出真正的图片信息
@# 注: jpeg 格式的 SOI marker : FFD8
@# bmp 格式:424D
@# 参数: 图片字段
@# 返回值: 无
@# 调用范例:ShowJpegField(rs("picture1"))
@# 注意: 调用此函数之前, 需要先申明 response.write 的 MIME 类型为 "image/jpeg"
@#-------------------------------------------------------------------------------------
function ShowJpegField(field)
dim size, i, j
@#要输出字段的总字节数
size = field.ActualSize

@#循环找到 SOI marker 的位置
for i = 1 to size
if AscB(MidB(field, i, 1)) = &HFF and AscB(MidB(field, i + 1, 1)) = &HD8 then
exit for
end if
next

@#忽略前面的无用信息, 从 SOI marker 开始输出真正的图片信息
for j = i to size
response.BinaryWrite MidB(field, j, 1)
next
end function
%>

<%
@#-------- 主程序开始 ------------------------------
dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=123;Data Source=MARK")

sql = "select * from xinxi_mishuchu"
set rs = conn.execute(sql)

@#声明输出类型, 清空输出缓冲区
response.buffer = true
response.clear
response.ContentType = "image/jpeg"

@#调用函数输出图片
ShowJpegField(rs("picture1"))

@#打完收功!
rs.close : set rs = nothing
conn.close : set conn = nothing
%>

如果是其他格式的图片, 如 bmp, gif 等, 输出方法类似, 只不过是 SOI marker 不同而已。

由于作者水平有限, 错误之处在所难免,欢迎大家批评指正。

原文转自:http://www.ltesting.net