Como obter o mapa de bits a partir do Access e apresentá-lo na página Web

Sumário

Este artigo mostra, por exemplo, como extrair as fotografias de mapa de bits na base de dados Microsoft Access 97 Nwind.mdb e visualizá-los a partir de um browser da Web utilizando o Active Server Pages (ASP). Para realizar esta tarefa, uma DLL de ActiveX tem de ser criada que faixas os cabeçalhos de acesso e OLE do campo. Este artigo mostra como criar esta DLL de ActiveX e como implementá-la.

Mais informações

Aviso: toda e qualquer utilização do código fornecidas neste artigo é da responsabilidade do utilizador. A Microsoft fornece este código "tal como está" sem garantias de qualquer tipo, expressa ou implícita, incluindo sem limitação, garantias implícitas de comercialização e/ou adequação a um fim específico.


Este artigo demonstra como utilizar o Visual Basic para obter um mapa de bits armazenado num campo objecto OLE. Uma vez que a definição de memória para o objecto OLE não está documentada, o código seguinte procura cabeçalho do objecto OLE caracteres consistentes com o início do gráfico. Este método poderá não funcionar em todas as circunstâncias.


Tenha em atenção de que o Internet Explorer 3.0 não consegue apresentar mapas de bits de cor verdadeira. Por este motivo, os mapas de bits armazenados na base de dados Access devem ser não superiores a 256 cores.

Exemplo passo a passo para extrair as fotografias

  1. Criar um novo projecto no Visual Basic e tornar o projecto uma DLL de ActiveX.

  2. Adicione uma referência para o ActiveX Data Objects (ADO) clicando no menu Projecto e seleccionando as referências. Seleccione "Microsoft OLE DB ActiveX Data Objects 1.0 Library" e clique em OK.

  3. Adicione um novo módulo ao projecto seleccionando o menu Project e clicando em Add Module. Seleccione o módulo e clique em Abrir.

  4. Coloque o código seguinte na secção (geral) (declarações) do 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 o código seguinte na secção (geral) (declarações) 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. Mudar o nome do projecto seleccionando o menu Projecto e clicar em 'Propriedades do projeto1' e escreva o novo nome no campo "Nome do projecto". Este exemplo parte do princípio de que é o nome do projecto "MyProject" e irá remeter para esse nome nos passos futuros.

  7. Seleccione a caixa de verificação de "Execução automática". Clique em OK.

  8. Mudar o nome da classe no painel de propriedades. Este exemplo assume que o nome da classe "MyClass" e refere-se a esse nome nos passos futuros.

  9. Compilar a DLL clicando no menu ficheiro e seleccionando "Tornar MyProject.dll."

  10. Crie uma página ASP denominada "bitmap.asp" que contém o código seguinte:

          <%@ 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. Crie uma página HTML com o nome "BitmapTest.htm" que contém o código seguinte:

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

Referências

Para obter informações adicionais, consulte o seguinte artigo na Microsoft Knowledge Base:

173308 como apresentar imagens armazenadas num campo BLOB

Para o artices mais recente do conhecimento e outras informações de suporte sobre Visual InterDev e Active Server Pages, consulte a seguinte página no site de suporte técnico da Microsoft:

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

Precisa de mais ajuda?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Obrigado pelos seus comentários!

Obrigado pelo seu feedback! Parece que poderá ser benéfico reencaminhá-lo para um dos nossos agentes de suporte do Office.

×