Clasificación de imágenes digitales de texturas usando la transformada Guillen
Imágenes en bases de datos usando ADO
-
Upload
jorgearmandodavilahurtado -
Category
Documents
-
view
5 -
download
0
Transcript of Imágenes en bases de datos usando ADO
Imgenes en bases de datos usando ADO
Imgenes en bases de datos usando ADO
(Ejemplo con el ADO Datacontrol)
Actualizado el 11/Jul/2001
Esto es una adaptacin a ADO del ejemplo publicado anteriormente para DAO sin el data control.Aunque en DAO con el DATACONTROL no hay que hacer nada especial para leer y guardar imgenes de una base de datos, sin embargo con ADO no es tan automtico, al menos no en lo que a guardar la imagen en la base se refiere.As que he tomado el cdigo usado en el ejemplo antes mencionado y lo he modificado para usar con ADO.Aqu te muestro el cdigo del mdulo BAS as como el cdigo del formulario de prueba.
El formulario de prueba tiene un ADO datacontrol, un TextBox para mostrar el campo Nombre y un pictureBox para mostrar las imgenes, adems de un CommonDialog para seleccionar las imgenes a insertar en el campo.Tambin tiene tres botones, uno para crear un nuevo registro, otro para guardar (actualizar) la informacin y un ltimo botn para modificar la imagen del registro activo.Al final te pongo un link con el cdigo completo y una base de datos Access 97 y otra de Access 2000 para que pruebes.Para usar una base u otra, simplemente comenta la asignacin correspondiente a ConnectionString del DATA.
El cdigo del mdulo BAS:Nota:El mtodo LeerBinary no se usa en este ejemplo, ya que el ADO Datacontrol actualiza automticamente los controles ligados a las imgenes guardadas en las bases de datos.
'------------------------------------------------------------------------------' Cdigo para grabar y leer imgenes en campos de bases ( 9/Abr/98)' Adaptado para usarlo con ADO (11/Jul/01)'' Adaptado de un par de ejemplos de la ayuda de VB5'' Guillermo 'guille' Som, 1998-2001' [email protected]'------------------------------------------------------------------------------Option ExplicitPrivate nFile As LongPrivate Chunk() As BytePrivate Const mBuffer As Long = 16384&
Public Sub LeerBinary(ADOField As ADODB.Field, unPicture As PictureBox)
' Leer la imagen del campo de la base y asignarlo al Picture '-------------------------------------------- ' Este procedimiento no es necesario usarlo ' si el Picture est ligado a un data control '-------------------------------------------- Dim nChunks As Long Dim nSize As Long Dim Fragment As Long Dim i As Long ' ' Se usa un fichero temporal para guardar la imagen nFile = FreeFile
Open "pictemp" For Binary Access Write As nFile
' ' Calcular los trozos completos y el resto nSize = ADOField.ActualSize
nChunks = Int(nSize / mBuffer)
Fragment = nSize Mod mBuffer
Chunk() = ADOField.GetChunk(Fragment)
Put nFile, , Chunk()
For i = 1 To nChunks
Chunk() = ADOField.GetChunk(mBuffer)
Put nFile, , Chunk()
Next Close nFile
Erase Chunk
' Ahora se carga esa imagen en el control unPicture.Picture = LoadPicture("pictemp")
' Ya no necesitamos el fichero, as que borrarlo On Error Resume Next If Len(Dir$("pictemp")) Then Kill "pictemp"
End If Err = 0
End SubPublic Sub GuardarBinary(ADOField As ADODB.Field, unPicture As PictureBox)
' Guardar el contenido del Picture en el campo de la base Dim i As Long Dim Fragment As Long Dim nSize As Long Dim nChunks As Long ' ' Guardar el contenido del picture en un fichero temporal SavePicture unPicture.Picture, "pictemp"
' Leer el fichero y guardarlo en el campo nFile = FreeFile
Open "pictemp" For Binary Access Read As nFile
nSize = LOF(nFile) ' Longitud de los datos en el archivo If nSize = 0 Then Close nFile
Exit Sub End If ' ' Calcular el nmero de trozos y el resto nChunks = nSize \ mBuffer
Fragment = nSize Mod mBuffer
ReDim Chunk(Fragment)
' Get nFile, , Chunk()
ADOField.AppendChunk Chunk()
ReDim Chunk(mBuffer)
For i = 1 To nChunks
Get nFile, , Chunk()
ADOField.AppendChunk Chunk()
Next i
Close nFile
' ' Ya no necesitamos el fichero, as que borrarlo On Local Error Resume Next If Len(Dir$("pictemp")) Then Kill "pictemp"
End If Err = 0
End SubEl cdigo del formulario de prueba:'------------------------------------------------------------------------------' Acceso a una base de datos con imgenes desde ADO (11/Jul/01)'' Revisado para ADO por: Guillermo 'guille' Som, 2001'------------------------------------------------------------------------------Option ExplicitPrivate Const mBuffer As Long = 1024&
Private Sub Command1_Click()
' Nuevo Text1.Text = "Nuevo"
Command1.Enabled = False Command2.Enabled = True Text1.Enabled = True Data2.Recordset.AddNew
CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
End SubPrivate Sub Command2_Click()
' Grabar GuardarBinary Data2.Recordset.Fields(Picture1.DataField), Picture1
Data2.Recordset.Update
Command1.Enabled = True Command2.Enabled = False Text1.Enabled = FalseEnd SubPrivate Sub Command3_Click()
' Modificar la imagen del registro actual CommonDialog1.ShowOpen
Picture1.Picture = LoadPicture(CommonDialog1.FileName)
' guardar Command2_Click
End SubPrivate Sub Form_Load()
' Asignar la base de datos y el recordset ' ' Para bases de datos Access 97 Data2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & App.Path & "\bd1.mdb"
' Para bases de datos Access 97 / 2000 'Data2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\bd2000.mdb" ' Data2.RecordSource = "SELECT * FROM [Sample Table]"
' ' Estos valores estn asignados en tiempo de diseo ' CommonDialog1.Filter = "*.bmp; *.gif|*.bmp; *.gif"
' Set Picture1.DataSource = Data2
Picture1.DataField = "Picture Field"
Picture1.DataFormat.Type = fmtPicture ' 2 (fmtPicture) ' Set Text1.DataSource = Data2
Text1.DataField = "Name"
Text1.DataFormat.Type = fmtGeneral
End Sub