如何从 Access 检索位图并将其显示在网页上

概要

本文通过示例演示了如何提取位图照片在 Microsoft Access 97 Nwind.mdb 数据库中,并使用 Active Server Pages (ASP) 在 Web 浏览器中查看它们。为了完成此任务,ActiveX DLL 必须创建该带的访问和 OLE 的标头字段中。本文介绍如何创建此 ActiveX DLL,以及如何实现它。

详细信息

警告: 您的代码的任何使用提供此文章是在您自己的风险。Microsoft 提供"按原样"此代码没有任何种类的明示或暗示的担保,包括但不是限于适销性和针对特定用途的适用性的暗示担保。


本文演示如何使用 Visual Basic 来检索存储在 OLE 对象字段中的位图。由于未记载 OLE 对象存储的定义,下面的代码中搜索对象的 OLE 头字符图形的开始与一致。在所有情况下,此方法可能无法工作。


请注意,Internet Explorer 3.0 是无法显示真彩色位图。鉴于此,应不高于 256 色位图存储在 Access 数据库中。

分步示例提取照片

  1. 在 Visual Basic 中创建一个新项目,使 ActiveX DLL 的项目。

  2. 通过单击项目菜单并选择引用添加的引用到 ActiveX 数据对象 (ADO)。选择"Microsoft OLE DB ActiveX 数据对象 1.0 库",然后单击确定。

  3. 通过选择项目菜单上,单击添加模块,向项目中添加一个新模块。选择模块,然后单击打开。

  4. 将以下代码放在模块 1 (常规) (声明) 部分。营业活动报表:

          ' Enter the following Declare statement as one single line:
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
    (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

    Type PT
    Width As Integer
    Height As Integer
    End Type

    Type OBJECTHEADER
    Signature As Integer
    HeaderSize As Integer
    ObjectType As Long
    NameLen As Integer
    ClassLen As Integer
    NameOffset As Integer
    ClassOFfset As Integer
    ObjectSize As PT
    OleInfo As String * 256
    End Type
  5. 将以下代码放在 CLASS1 (常规) (声明) 部分。CLS 中:

            Function DisplayBitmap(ByVal OleField As Variant)
    Dim Arr() As Byte
    Dim ObjHeader As OBJECTHEADER
    Dim Buffer As String
    Dim ObjectOffset As Long
    Dim BitmapOffset As Long
    Dim BitmapHeaderOffset As Integer
    Dim ArrBmp() As Byte
    Dim i As Long

    'Resize the array, then fill it with
    'the entire contents of the field
    ReDim Arr(OleField.ActualSize)
    Arr() = OleField.GetChunk(OleField.ActualSize)

    'Copy the first 19 bytes into a variable
    'of the OBJECTHEADER user defined type.
    CopyMemory ObjHeader, Arr(0), 19

    'Determine where the Access Header ends.
    ObjectOffset = ObjHeader.HeaderSize + 1

    'Grab enough bytes after the OLE header to get the bitmap header.
    Buffer = ""
    For i = ObjectOffset To ObjectOffset + 512
    Buffer = Buffer & Chr(Arr(i))
    Next i

    'Make sure the class of the object is a Paint Brush object
    If Mid(Buffer, 12, 6) = "PBrush" Then
    BitmapHeaderOffset = InStr(Buffer, "BM")
    If BitmapHeaderOffset > 0 Then

    'Calculate the beginning of the bitmap
    BitmapOffset = ObjectOffset + BitmapHeaderOffset - 1

    'Move the bitmap into its own array
    ReDim ArrBmp(UBound(Arr) - BitmapOffset)
    CopyMemory ArrBmp(0), Arr(BitmapOffset), UBound(Arr) -
    BitmapOffset + 1

    'Return the bitmap
    DisplayBitmap = ArrBmp
    End If
    End If
    End Function
  6. 通过选择项目菜单,然后单击"项目 1 属性"上重命名该项目并在"项目名称"字段中键入新名称。本示例假定您在"我的项目"命名该项目,并将在以后的步骤中该名称引用。

  7. 选择"无人参与执行"复选框。单击确定。

  8. 重命名属性窗格中的类。此示例假定您是类命名为"MyClass",指的是在以后的步骤中该名称。

  9. 编译该 DLL,方法是单击文件菜单,然后选择"使 MyProject.dll"。

  10. 创建名为"bitmap.asp",其中包含以下代码的 ASP 页:

          <%@ LANGUAGE="VBSCRIPT" %>
    <%
    ' You need to set up a System DSN named 'NWind' that points to
    ' the Northwind.mdb database
    Set DataConn = Server.CreateObject("ADODB.Connection")
    DataConn.Open "DSN=NWind", "admin", ""
    Set cmdTemp = Server.CreateObject("ADODB.Command")
    Set RS = Server.CreateObject("ADODB.Recordset")
    cmdTemp.CommandText = "SELECT Photo FROM Employees
    WHERE EmployeeID = 1"
    cmdTemp.CommandType = 1
    Set cmdTemp.ActiveConnection = DataConn
    RS.Open cmdTemp, , 0, 1
    Response.ContentType = "image/bmp"
    Set Bitmap = Server.CreateObject("MyProject.MyClass")
    Response.BinaryWrite Bitmap.DisplayBitmap(RS("Photo"))
    RS.Close
    %>
  11. 创建一个名为"BitmapTest.htm",其中包含以下代码的 HTML 页面:

          <HTML>
    <HEAD>
    <TITLE>Bitmap Test</TITLE>
    </HEAD>
    <BODY>
    <HR>
    <img src="Bitmap.asp">
    <HR>
    </BODY>
    </HTML>

参考资料

有关其他信息,请参阅下面 Microsoft 知识库中相应的文章:

173308如何存储 BLOB 字段中显示的图像

最新知识库文章 artices 和其他 Visual InterDev 和 Active Server Pages 的支持信息,请参阅下页 Microsoft 技术支持网站上:

http://support.microsoft.com/search/default.aspx?qu=vinterdev

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

你对翻译质量的满意程度如何?

哪些因素影响了你的体验?

是否还有其他反馈?(可选)

谢谢您的反馈意见!

×