Cómo recuperar el mapa de bits de Access y mostrarla en la página Web


Resumen


En este artículo se muestra por ejemplo cómo extraer las fotos de mapa de bits en la base de datos de Microsoft Access 97 Nwind.mdb y verlos desde un explorador Web mediante páginas Active Server (ASP). Para realizar esta tarea, una DLL de ActiveX debe crearse esa tiras los encabezados acceso y OLE del campo. Este artículo muestra cómo crear esta DLL ActiveX y cómo implementarlo.

Más información


Advertencia: cualquier uso del código proporcionado en este artículo queda bajo su propia responsabilidad. Microsoft proporciona este código "tal cual" sin garantía de ningún tipo, expresa o implícita, incluyendo pero sin limitarse a las garantías implícitas de comerciabilidad y/o idoneidad para un propósito particular.


En este artículo se muestra cómo utilizar Visual Basic para recuperar un mapa de bits almacenado en un campo objeto OLE. Dado que la definición de almacenamiento de objetos OLE no está documentada, el código siguiente busca en el encabezado del objeto OLE para caracteres coherentes con el inicio del gráfico. Este método no funcionen en todas las circunstancias.


Tenga en cuenta que Internet Explorer 3.0 es incapaz de mostrar mapas de bits de color verdadero. Por esta razón, los mapas de bits almacenados en la base de datos de Access deben ser no superior a 256 colores.

Ejemplo paso a paso para extraer las Fotos

  1. Cree un nuevo proyecto en Visual Basic y convertir el proyecto en una DLL de ActiveX.
  2. Agregue una referencia a objetos de datos ActiveX (ADO) haciendo clic en el menú proyecto y seleccionando referencias. Seleccione "Microsoft OLE DB ActiveX Data Objects 1.0 Library" y haga clic en Aceptar.
  3. Agregue un módulo nuevo al proyecto seleccionando el menú proyecto y haga clic en Agregar módulo. Seleccione el módulo y haga clic en Abrir.
  4. Coloque el código siguiente en la sección (general) (declaraciones) de MODULE1. BAS:
          ' 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. Coloque el código siguiente en la sección (general) (declaraciones) de 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. Cambie el nombre del proyecto seleccionando el menú proyecto y haga clic en "Propiedades de Project1" y escriba el nuevo nombre en el campo "Nombre de proyecto". En este ejemplo se supone que denomina el proyecto "Miproyecto" y hará referencia a ese nombre en pasos posteriores.
  7. Active la casilla de verificación "Ejecución desatendida". Haga clic en Aceptar.
  8. Cambiar el nombre de la clase en el panel de propiedades. En este ejemplo se supone que denominada "MyClass" de la clase y hace referencia a ese nombre en pasos posteriores.
  9. Compile la DLL haciendo clic en el menú archivo y seleccionando "Hacer MyProject.dll."
  10. Crear una página ASP denominada "bitmap.asp" que contiene el código siguiente:
          <%@ 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. Crear una página HTML denominada "BitmapTest.htm" que contiene el código siguiente:
          <HTML>
    <HEAD>
    <TITLE>Bitmap Test</TITLE>
    </HEAD>
    <BODY>
    <HR>
    <img src="Bitmap.asp">
    <HR>
    </BODY>
    </HTML>

Referencias


Para obtener información adicional, consulte el artículo siguiente en Microsoft Knowledge Base:

173308 cómo mostrar imágenes almacenadas en un campo BLOB

Para los artículos de Knowledge Base más recientes y otra información de soporte sobre Visual InterDev y páginas Active Server, vea la siguiente página en el sitio de soporte técnico de Microsoft: