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

对象|数据|数据库|显示

在 ASP 中, 我们经常需要在 Web 页面上显示以二进制方式保存在数据库中的图片。 一般的图片显示没有什么问题, 因为这方面的文章已经很多了, 我就不再阐述。 但有时候数据库中的图片是通过其他办公软件输入的, 或者通过其他方式, 比如在 Access 中直接添加。 这时, 图片以 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 不同而已。

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

时间: 2024-10-31 13:31:18

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

Java从数据库中读取Blob对象图片并显示的方法_java

本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法.分享给大家供大家参考.具体实现方法如下: 第一种方法: 大致方法就是,从数据库中读出Blob的流来,写到页面中去: 复制代码 代码如下: Connection conn = DBManager.getConnection();   String sql = "SELECT picture FROM teacher WHERE id=1";   PreparedStatement ps = null;   ResultSe

批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor

原文:批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPROMPT5.3对各种加密对象的解密测试 SQL2005解密已经被加密的存储过程 昨天ahdung 童鞋介绍了这个工具给我,非常感谢他 dbForge SQL Decryptor这个工具的软件公司是dev

数据库是ACCESS的,我可以将图片成功地插入到数据库中,但是读出来的时候,图片显示不出来,显示的是一个大红叉

问题描述 数据库是ACCESS的,我可以将图片成功地插入到数据库中,但是读出来的时候,图片显示不出来,显示的是一个大红叉,想问一下,是不是数据库对应图片设置的字段类型的问题,我设置的是OLE对象(如果不是OLE对象,那么应该是什么呢?),如果是设置的这个类型,那么是什么原因导致我读不出图片呢?十分感谢大家的帮助我传入了一个序号,依据这个序号查的图片,数据库中是有值的啊stringstrImageID=Request.QueryString["num"].ToString();Respo

重新编译数据库中的失效对象

原文整理自:http://www.51testing.com/?uid-16403-action-viewspace-itemid-98161:http://www.eygle.com/archives/2005/01/ecioaeaoeeeaoea.html 先看个帖子:http://www.itpub.net/thread-1112553-1-1.html 每次数据库做了升级(打各种数据库方面的补丁后,不是数据库本身的升级,是各种对象改变增加修改等,呵呵不,别误解)完了以后我都要查一下数据库

jtable显示数据库中的数据,为什么数据显示不完全,第一列列名也没有

问题描述 jtable显示数据库中的数据,为什么数据显示不完全,第一列列名也没有 10C 解决方案 用JTable显示数据库数据将数据库中的数据显示到JTable上将Excel中的数据在JTable中显示 解决方案二: 你for循环写的从1开始的..

asp.net用gridview显示数据库中两个表的数据?

问题描述 asp.net用gridview显示数据库中两个表的数据? asp.net用gridview显示数据库中两个表的数据?把两表绑定在datatable并用gridview显示数据 解决方案 两个表什么关系?如果是一样的表结构,用union连接,如果是主系表关系,那么可以用join.具体按照我说的google下. 解决方案二: 不管是查询几个表,最后通过sql语句走ado.net,查询出来的数据都放入DataTable或DataSet中,然后绑定到gridview 解决方案三: 如果是一起

jfreechart显示数据库中的数据实例

问题描述 jfreechart显示数据库中的数据实例 我想用jfreechart做一个柱状图(只是做个练习),显示数据库(mysql)中的数据,这个可以在jsp中显示吗,请问怎么做,哪位有实例让我看看啊

仪表盘的使用-如何能webform上面用仪表盘,来显示数据库中的数据。

问题描述 如何能webform上面用仪表盘,来显示数据库中的数据. 我想在网页上添加一个仪表盘控件,显示数据库中的数据.请问如何实现?能使用什么控件实现?我用的是VS2010 +SQL2005

select-在C#的combobox中显示数据库中所有的表名,但是sql语句不知道怎么写

问题描述 在C#的combobox中显示数据库中所有的表名,但是sql语句不知道怎么写 List<string> tableNames = "Select( (string)x["Table_Name"] from dt where type=1 and flags=0)"; dt是连接数据库时设定的表名 解决方案 sql语句如下所示:SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' 前提是提前设置好config配置文