日期:2011-08-03 浏览次数:21213 次
这时, 图片以 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 不同而已。
由于作者水平有限, 错误之处在所难免,欢迎大家批评指正。