Al principio yo pensaba lo mismo y trabajaba asi desde hace mucho tiempo, ssccaann y otros grandes programadores me asesoraron para que lo hiciera asi.
Pero encontre una forma muy facil y de pocos recursos a la base de datos. Lo primero que hay que hacer es aprender a trabajar con los archivos temporales y poder eliminarlos. yo cargo la imagen dentro de un picture box o imagebox a preferencia es lo mismo.... y empleo este codigo para poder mostrarlo en el control.
Sub Centrar_Imagen(Objeto As Object, Path_Imagen As String)
On Error GoTo ErrSub
Dim Pos_x As Single 'Posición horizontal de la imagen
Dim Pos_y As Single 'Posición vertical de la imagen
Dim Ancho_IMG As Single 'Ancho de la imagen
Dim Alto_IMG As Single 'Alto de la imagen
Dim Ancho_Obj As Single 'Ancho en Pixeles del objeto contenedor
Dim Alto_Obj As Single 'Alto en Pixeles del objeto contenedor
Dim old_Scale As Single 'Para lamacenar el ScaleMode del objeto
Static old_Path As String
If old_Path <> Path_Imagen Then
Set Pic = LoadPicture(Path_Imagen)
End If
With Objeto
.AutoRedraw = True
.Cls
old_Scale = .ScaleMode
.ScaleMode = vbPixels
'Pasa el ancho y alto de la imagen a Pixeles
Ancho_IMG = .ScaleX(Pic.Width, vbHimetric, vbPixels)
Alto_IMG = .ScaleY(Pic.Height, vbHimetric, vbPixels)
Ancho_Obj = .ScaleWidth
Alto_Obj = .ScaleHeight
If Ancho_IMG > Ancho_Obj Then
Alto_IMG = Alto_IMG * Ancho_Obj / Ancho_IMG
Ancho_IMG = Ancho_Obj
End If
If Alto_IMG > Alto_Obj Then
Ancho_IMG = Ancho_IMG * Alto_Obj / Alto_IMG
Alto_IMG = Alto_Obj
End If
' Posición X e Y donde dibujar con PaintPicture
Pos_x = (Ancho_Obj - Ancho_IMG) / 2
Pos_y = (Alto_Obj - Alto_IMG) / 2
End With
'Dibuja la imagen
Objeto.PaintPicture Pic, Pos_x, Pos_y, Ancho_IMG, Alto_IMG
'Restaura el ScaleMode
Objeto.ScaleMode = old_Scale
old_Path = Path_Imagen
Exit Sub
'Error
ErrSub:
MsgBox Err.Description, vbCritical
End Sub
eso se coloca en un modulo y se llama de la siguiente forma
'cd es el comandialog
CD.ShowOpen
Centrar_Imagen Picture1, CD.FileName
a si que me queda la imagen dibujada en el picturebox para despues poder guardarla a un archivo temporal rediriguido al app.path de la siguiente forma
Set Imagen = Picture1.Image
SavePicture Imagen, App.Path & "\imagen.jpg"
Set Imagen = Nothing
ExportImagen App.Path & "\imagen.jpg", categorias!Imagen
y el exportimagen es el siguiente
Public Function ExportImagen(urlimg As String, Item As ADODB.Field)
On Error GoTo errimg
Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream
Stream.Type = adTypeBinary
Stream.Open
Stream.LoadFromFile urlimg
Item.Value = Stream.Read
Exit Function
errimg:
End Function
con eso se guarda en un campo BLOB o un OLEDB y lo encrypta como binario y despues lo recupera con otro modulito... esto genera una pic mas pequeña de lo que deberia ser y con una buena calidad.... aparte de eso.... no carga demasiado la base de datos.