Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: E N T E R en Marzo 14, 2011, 03:39:03 pm

Título: [SOURCE] Como guardar una imagen en un Base Datos
Publicado por: E N T E R en Marzo 14, 2011, 03:39:03 pm
La verdad no se como seria el titulo lo puse así por que la mayoría pregunta de esa forma. Lo que hace este código es guardar en la BD el nombre de la imagen de acuerdo al CODIGO Y NOMBRE DEL ARTICULO. Yo digo que este es la forma mas fácil y mas rápido así no crece tanto la bd.

(http://s2.subirimagenes.com/imagen/previo/thump_6110087formarticulos.png)

(http://s2.subirimagenes.com/imagen/previo/thump_6110359formarticulosalta.png)

Aca el Source
http://www.mediafire.com/?fsq2vqv3mrl8chl
Título: Re:[SOURCE] Como guardar una imagen en un Base Datos
Publicado por: YAcosta en Marzo 14, 2011, 07:07:17 pm
Bien. lo que haces con la foto es hacer una copia en tu carpeta Imagenes con el nombre asignado. Esta bueno aunque por el momento hago lo mismo pero por afuera (por ahorrarme unas cuantas lineas de código jeje), es decir, le enseño al cliente que lo haga a nivel de Explorador de Windows, cuando tenga un software que masifique entonces tomare la forma que lo haces porque me parece mas adecuada.

Saliendo del tema:
Una recomendación, veo que pusiste Pictures y dentro el textbox, es claro que lo haces para darle un efecto visual mas agradable y estoy de acuerdo con ello. Pero, te recomiendo que no uses controles Pictures sino controles Images y lograras el mismo efecto, la diferencia es que cada control picture te consume mucho mas memoria que un control Image (hay quien dice que consume como 10 veces mas) y si solo es para darle ese efecto realmente no vale la pena.

No te comento sobre el uso de los Pictures que simulan formularios porque imagino que eso falta trabajar ya que pones alli el control de minimizar, maximizar y cerrar y solo están dibujados. Pero ten cuidado que cuando abres el Picture formulario el usuario todavia tendria acceso a los controles que lo rodean y puedes tener una funcionalidad inesperada.

Saludos
Título: Re:[SOURCE] Como guardar una imagen en un Base Datos
Publicado por: E N T E R en Marzo 15, 2011, 11:10:28 am

No te comento sobre el uso de los Pictures que simulan formularios porque imagino que eso falta trabajar ya que pones alli el control de minimizar, maximizar y cerrar y solo están dibujados. Pero ten cuidado que cuando abres el Picture formulario el usuario todavia tendria acceso a los controles que lo rodean y puedes tener una funcionalidad inesperada.


Gracias por las recomendaciones YvanB lo tomare en cuenta pero como dices ahí hay a tras de todo un Picture que se llama picBloque que cuando le llamas a las ventanas simuladas se bloquea todo y no se puede volver atrás. podes probar lo uso así para evitar escribir millones de cmdguardar.enabled = false cmdeditar.enabled = false, etc....
Título: Re:[SOURCE] Como guardar una imagen en un Base Datos
Publicado por: YAcosta en Marzo 15, 2011, 12:20:01 pm
De acuerdo, solo para meter un poco mas de leña jeje
1.- No es necesario hacer por cada control un .enabled = false, solo haces algo similar a (checar detalles y ajustar):
Código: (vb) [Seleccionar]
    Dim xCtrl As Control 
    For Each xCtrl In Me.Controls 
        If TypeOf xCtrl Is CommandButton Then 
           xCtrl.Enabled = False
        End If 
    Next 

2.- Sin embargo tampoco usaría esto porque estaría cargando igual muchos controles dentro de un pic que solo lo usare cada vez que lo invoque, preferiria usar un nuevo form para agregar un producto nuevo y llamarlo así: frmNuevoProd.Show 1
De esta forma, el "1" hace que quede inaccesible el formulario anterior hasta que no cerremos el frmNuevoProd.

Solo son sugerencias, igual si la forma que lo haces te resulta mas cómodo y eres mas eficiente y productivo desarrollando asi entonces dale con todo y sobre esa forma ajustamos mas.

Un abrazo.
Título: Re:[SOURCE] Como guardar una imagen en un Base Datos
Publicado por: E N T E R en Marzo 15, 2011, 12:46:06 pm

frmNuevoProd.Show 1 esto no me lo sabia y si cada día se aprende algo jejejeje
De esta forma, el "1" hace que quede inaccesible el formulario anterior hasta que no cerremos el frmNuevoProd.

Título: Re:[SOURCE] Como guardar una imagen en un Base Datos
Publicado por: wolf_kof en Marzo 15, 2011, 05:24:44 pm
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.

Código: (vb) [Seleccionar]
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

Código: (vb) [Seleccionar]
'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

Código: (vb) [Seleccionar]
    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

Código: (vb) [Seleccionar]
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.