none
Como insertar imagen en MySql RRS feed

  • Pregunta

  • Buenos Dias.

    Deseo saber si alguno de ustedes me puede colaborar indicandome como insertar imagenes desde Visual Basic .NET (9) a un campo en una base de datos en MySql.

    Cualquier ayuda de antemano la agradezco.
    jueves, 9 de octubre de 2008 14:04

Respuestas

Todas las respuestas

  • ¿Queres guardar la imagen, o la ruta de acceso a la misma?

    jueves, 9 de octubre de 2008 14:41
  • Deseo guardar la imagen como tal, la ruta la almacenaria en un string o algo asi, pero deseo almacenar la imagen en la base de datos y luego mostrarla en un formulario de VB, como puedo hacer eso??¿?
    jueves, 9 de octubre de 2008 14:43
  • Aqui hay un ejemplo com sql server: http://www.elguille.info/NET/ADONET/SQL2005Express/imagenes_base_SQLServer.htm, no se si varia mucho, de todas formas no se recomienda guardar imagenes enteras en una base de datos, conviene mas guardar la dirección y luego teniendo la direccion cargar un picturebox

    jueves, 9 de octubre de 2008 14:51
  • Viejo muchas gracias por el link al igual que por la recomendacion, voy a probarlo.
    jueves, 9 de octubre de 2008 14:54
  •  

    hola, te cuento, necesitaba lo mismo y entonces, investigando y uniendo esfuerzos logré lo siguiente,

    creo en la base la tabla donde voy a guardar la imagen una tabla con un campo blob (en mi caso un campo imagen de tipo mediumblob)

     

    ******** ESTRUCTURA DE LA TABLA

    CREATE TABLE `productos_imagenes` (
      `Cod_Barras` varchar(13) NOT NULL,
      `Imagen` mediumblob,
      PRIMARY KEY  (`Cod_Barras`)
    )

    lo q yo traté de conseguir es guardar una imagen que se seleccione de algún medio, tipo jpg, gif o png, que achique la imagen a un tamaño predefinible (para que no ocupe mucho espacio) y luego guardarla en la base

    en el formulario de abm coloco un picturebox de nombre pbimagen (300 x 220) y debajo un botón seleccionar

     

    *** RUTINA DEL BOTON (CARGO LA IMAGEN DE ALGUN DISCO O ALGO EN EL PICTUREBOX)

    Private Sub btnSeleccionarImagen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSeleccionarImagen.Click

    Dim openFileDialog1 As New OpenFileDialog()

    openFileDialog1.Filter = "Imágenes |*.jpg; *.png; *.gif"

    openFileDialog1.Title = "Seleccione una Imagen"

    ' Show the Dialog.

    ' If the user clicked OK in the dialog and

    ' a .CUR file was selected, open it.

    If openFileDialog1.ShowDialog() = DialogResult.OK Then

    ' Assign the cursor in the Stream to the Form's Cursor property.

    Me.pbImagen.ImageLocation = openFileDialog1.FileName

    Me.pbImagen.Load()

    Else

    Me.pbImagen.Image = Nothing

    End If

    End Sub

     

    ******* UTILIZO UNA CLASE IMAGEMANIPULATION (mezcla de cosas encontradas en internet con algunas modificaciones) DONDE SE ACHICA LA IMAGEN Y DONDE LA CONVIERTO A BYTES P/ GUARDAR Y VICEVERSA

    Imports System.Drawing.Imaging

    Public Class ImageManipulation

    Public Shared Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo

    Dim j As Integer

    Dim encoders As ImageCodecInfo()

    encoders = ImageCodecInfo.GetImageEncoders()

    For j = 0 To encoders.Length

    If encoders(j).MimeType = mimeType Then

    Return encoders(j)

    End If

    Next j

    Return Nothing

    End Function

    Public Shared Sub SaveJPGWithCompressionSetting(ByVal image As Image, ByVal szFileName As String, ByVal lCompression As Long)

    Dim eps As EncoderParameters = New EncoderParameters(1)

    eps.Param(0) = New EncoderParameter(Encoder.Quality, lCompression)

    Dim ici As ImageCodecInfo = GetEncoderInfo("image/jpeg")

    Try

    image.Save(szFileName, ici, eps)

    Catch exc As Exception

    MessageBox.Show(exc, " Atención !", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

    End Sub

    Public Shared Function Image2Bytes(ByVal img As Image) As Byte()

    Dim sTemp As String = System.IO.Path.GetTempFileName()

    Dim SourceToImage As New Bitmap(img)

    Dim NeedsHorizontalCrop As Boolean = True

    Dim NeedsVerticalCrop As Boolean = False

    'Determina si la imagen es Landscape o Portrait

    If SourceToImage.Height > SourceToImage.Width Then

    NeedsHorizontalCrop = False

    NeedsVerticalCrop = True

    End If

    'Determina si la imagen excede el ancho del PictureBox

    If SourceToImage.Width < 300 Then

    NeedsHorizontalCrop = False

    If SourceToImage.Height > 220 Then

    NeedsVerticalCrop = True

    End If

    End If

    'Calcula el Factor de Ajuste

    Dim scale_factor As Single = 1

    If SourceToImage.Width > 0 Then

    If NeedsHorizontalCrop = True Then

    ' Obtiene el Factor de Ajuste

    scale_factor = 300 / SourceToImage.Width

    End If

    End If

    If SourceToImage.Height > 0 Then

    If NeedsVerticalCrop = True Then

    ' Obtiene el Factor de Ajuste

    scale_factor = 220 / SourceToImage.Height

    End If

    End If

    ' Generar un bitmap tmp para el resultado. Ajuste Proporcional

    Dim DestTmpImage As New Bitmap( _

    CInt(SourceToImage.Width * scale_factor), _

    CInt(SourceToImage.Height * scale_factor))

    ' Generar un objeto Gráfico para el bitmap tmp resultante

    Dim gr_desttmp As Graphics = Graphics.FromImage(DestTmpImage)

    ' Copiar la imagen origen al bitmap tmp destino

    gr_desttmp.DrawImage(SourceToImage, 0, 0, _

    DestTmpImage.Width, _

    DestTmpImage.Height)

    'Comprime y Guarda un Archivo Temporal para calcular su peso en Kb

    Try

    ImageManipulation.SaveJPGWithCompressionSetting(DestTmpImage, sTemp, 70)

    Catch exc As Exception

    MessageBox.Show(exc, " Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

    Dim fs As System.IO.FileStream

    Dim FileSize As UInt32

     

    fs = New System.IO.FileStream(sTemp, System.IO.FileMode.Open, System.IO.FileAccess.Read)

    FileSize = fs.Length

    Dim rawData() As Byte

    rawData = New Byte(FileSize) {}

    fs.Read(rawData, 0, FileSize)

    fs.Close()

    Return rawData

    End Function

    Public Shared Function Bytes2Image(ByVal bytes() As Byte) As Image

    If bytes Is Nothing Then Return Nothing

    '

    Dim ms As New System.IO.MemoryStream(bytes)

    Dim bm As Bitmap = Nothing

    Try

    bm = New Bitmap(ms)

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    End Try

    Return bm

    End Function

    End Class

     

    ********* RUTINA PARA GUARDAR EN LA BASE

    Private Sub Guardar()

    Try

    Mysql.myCommand.CommandText = "begin"

    Mysql.myCommand.ExecuteNonQuery()

    ' Dim x As New S

    sql = "insert into productos_imagenes values ('" & Me.txtCodBarras.Text & "', ?Image )"

    ImageManipulation.Image2Bytes(pbImagen.Image)

    Mysql.myCommand.CommandText = sql

    'Mysql.myCommand.Parameters.Add("?Image", Me.rawData)

    Mysql.myCommand.Parameters.Add("?Image", ImageManipulation.Image2Bytes(pbImagen.Image))

    'Mysql.myCommand.Parameters.Add("?Image", Me.rawData)

    Mysql.myCommand.ExecuteNonQuery()

    Mysql.myCommand.Parameters.Clear()

    MessageBox.Show("El Producto se ha guardado con éxito", "PRODUCTO GUARDADO!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

    Catch ex As Exception

    'Panel.registrarError(ex.Message & "(ProductosAm/GuardaNuevo)")

    'Respuesta = "Error al guardar, Reintente - \n" & ex.Message

    Mysql.myCommand.CommandText = "rollback"

    Mysql.myCommand.ExecuteNonQuery()

    MessageBox.Show("", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)

    Finally

    Mysql.myCommand.CommandText = "commit"

    Mysql.myCommand.ExecuteNonQuery()

    End Try

    End Sub

     

    ****** RUTINA PARA LEER LA IMAGEN DE LA BASE Y MOSTRARLA EN EL PICTUREBOX

    private Sub CargarImagen(CodBarras)

    sql = "select * from productos_imagenes where Cod_Barras = " & Me.txtCodBarras.Text

    Mysql.myCommand.CommandText = sql

    Mysql.myReader = Mysql.myCommand.ExecuteReader

    If Mysql.myReader.HasRows Then

    Mysql.myReader.Read()

    Me.pbImagen.Image = ImageManipulation.Bytes2Image(Mysql.myReader("imagen"))

    Mysql.myReader.Close()

    End If

    Mysql.myReader.Close()

    end sub

     

     

    ******* CON ESTO LOGRO GUARDAR IMÁGENES DE 300 X 220 INDEPENDIENTEMENTE DEL TAMAÑO DE LA IMAGEN DE ORIGEN PARA Q NO SEAN MUY PESADAS, EL TAMAÑO FINAL SE PUEDE MODIFICAR EN LA CLASE IMAGEMANIPULATION

     

    EN EL CASO DE UNA MODIFICACIÓN, EN MI CASO LO QUE HAGO ES BORRAR ESE REGISTRO Y REINSERTARLO CON LA NUEVA IMAGEN.

     

    ESPERO QUE LES SIRVA, FUNCIONA A LA PERFECCIÓN, LA IDEA ES DEVOLVER UN POQUITO DE TANTAS AYUDAS RECIBIDAS. SALUDOS.

     

     

    • Propuesto como respuesta fernando71 jueves, 4 de agosto de 2011 17:33
    miércoles, 3 de diciembre de 2008 23:45
  • Hola Hugo Ernesto estube revisando yu codigo, la verdad recien empieso por esto del .net y estoy haciendo lo mismo pero en c# y me da un error al pasar tu codigo a c#.

    en esta linea

    ImageAttributes.SaveJPGWithCompressionSetting(DestTmpImage, sTemp, 70);
    aparece este rror;

    Error    4    'Encoder' es una referencia ambigua entre 'System.Text.Encoder' y 'System.Drawing.Imaging.Encoder'    C:\Documents and Settings\Administrador\Mis documentos\Visual Studio 2005\Projects\SACE\SACE\Formularios\ModuloConfiguracion\frmCreaPersonal.cs    71    49    SACE

    y en esta otra

    eps.Param[0] = new EncoderParameter(Encoder.Quality, lCompression);

    Error    5    'System.Text.Encoder' no contiene una definición para 'Quality'    C:\Documents and Settings\Administrador\Mis documentos\Visual Studio 2005\Projects\SACE\SACE\Formularios\ModuloConfiguracion\frmCreaPersonal.cs    71    57    SACE

    si me pueden dar una mano gracias

    gracias
    viernes, 17 de abril de 2009 18:19
  • Si te sirve de algo Netdesing Edita en los dos errores donde tienes "Encoder.Quality" Cambialo por "System.Drawing.Imaging.Encoder.Quality" y listo, me generó los mismos errores pero asi lo reparé.

    SALUDOS
    miércoles, 22 de abril de 2009 21:42
  • A mi me da error en lo siguiente:

    //Calcula el Factor de Ajuste
          float scale_factor = 1;
          if (SourceToImage.Width > 0)
          {
            if (NeedsHorizontalCrop == true)
              scale_factor = 300 / SourceToImage.Width;
          }
          if (SourceToImage.Height > 0)
          {
            if (NeedsVerticalCrop == true)
              scale_factor = 220 / SourceToImage.Height;
          }

    Yo lo pasé a C#... Pero es exactamente lo mismo uqe hacen uds. Cuando pretendo transformarla imágen  entra por el segundo if y hace scale_factor = 220 / SourceToImage.Height;, devolviéndome scale_factor = 0.0

    ¿Alguien sabe resolverlo?


    Gabriela
    • Propuesto como respuesta netdesing viernes, 28 de mayo de 2010 4:13
    sábado, 8 de mayo de 2010 19:58
  • Hola yo ya resolví este tema aquí te paso el código esta realizado en C#

    primero debes de tener declarado estos namespaces

     

    using System.Drawing;

    using System.Drawing.Imaging;

    using System.IO;

     

    en el evento o método que uses para grabar pones esto

    MemoryStream mstGrabaFoto = new MemoryStream();

    picFoto.Image.Save(mstGrabaFoto, ImageFormat.Jpeg);

    objDatos[12] = mstGrabaFoto.GetBuffer();

    // el picFoto es el objeto picture de mi formulario

    //Este objDatos[12] es un arreglo de datos que uso para pasar los datos del formulario a mi          clase conexión a mi base de datos"

     

    el tu clase o en el mismo metodo si ese el caso de grabar usas esto

    myComando.Parameters.AddWithValue("_pac_foto", (byte[])objDatos[12]);

    // _pac_foto es el nombre del parámetro de mi store procedure de mysql

    myComando.Parameters["_pac_foto"].Direction = ParameterDirection.Input;

    // en la base de datos tu campo de la imagen dede se longblob

     

    para que puedas recuperar la magen y volverla a mostrar una vez grabada

    debes de crear este método

    private Image ByteToImage(byte[] datos)

            {

                if (datos == null)

                {

                    return null;

                }

                else

                {

                    return new Bitmap(new MemoryStream(datos));

                }

            }

    y lo invocas de esta manera

    picFoto.Image = ByteToImage((byte[])dtsDatosPacientes.Tables[0].Rows[0]["pac_foto"]);

    esto es lo que te trae el datatable de la consulta que hago para recuperar información desde el mysql


    saludos espero que te sea de utilidad como ami

     

     

     

     

     

    • Propuesto como respuesta Joy Montero viernes, 28 de mayo de 2010 16:04
    lunes, 10 de mayo de 2010 19:20
  • Hola Gabriela cuentanos como te fue con la insercion de las imagenes en MYSQl

     

    saludos

    viernes, 28 de mayo de 2010 4:15
  • amgio tu ayuda me fue de lujo, tenia varios días intentando hacer esto y por fin lo resolvi una ayuda mas si tengo el bdd mas de un foto relacionada al registro, es decir tengo una tabla con las fotos y sus claves

    y una tabla con los registros relacionados a estas fotos, quiero que un registro se vean varias fotos en varios textbox

    jueves, 4 de agosto de 2011 17:35
  • Simplemente excelente
    JEYSSON RAMIREZ | Desarrollador Bogotá
    lunes, 29 de agosto de 2011 0:58
  • Hola a todos y muchas gracias por este aporte, estoy teniendo un problema y es que logro inserter los datos a la base de datos pero solo me visualiza algunos en el formulario, en la base de satos se guardan todos perfectamente, solo es al momento de visualizar en el formulario es que me muestra los que pesan menos de 8k.

    muchas gracias por su ayuda.


    pos (PUNTOS DE VENTA Y FACTURACION)
    viernes, 21 de octubre de 2011 15:06
  • hola amigos estuve implementando el código pero me tope con un error al momento de seleccionar un .GIF  en el  Show the Dialog. 

    La verdad el error dice :

    Error genérico en GDI+

    a alguien le a pasado al seleccionar un GIF?

    cual seria la solución?


    Vladimir Rodriguez Quito - Ecuador
    jueves, 15 de diciembre de 2011 20:43
  • Hola Hugo Ernesto mira pues trato de utilizar el codigo pero en esta subrutina  mysql.mycommand.commandtext="begin", es decir todo lo que dice mysql.mycommand me marca error, es porque me falta importar la libreria o es solo mysql.command o mysqlcommand?

    Saludos espero respuesta:

    ********* RUTINA PARA GUARDAR EN LA BASE

    Private SubGuardar()

    Try

    Mysql.myCommand.CommandText = "begin"

    Mysql.myCommand.ExecuteNonQuery()

    ' Dim x As New S

    sql = "insert into productos_imagenes values ('" & Me.txtCodBarras.Text & "', ?Image )"

    ImageManipulation.Image2Bytes(pbImagen.Image)

    Mysql.myCommand.CommandText = sql

    'Mysql.myCommand.Parameters.Add("?Image", Me.rawData)

    Mysql.myCommand.Parameters.Add("?Image", ImageManipulation.Image2Bytes(pbImagen.Image))

    'Mysql.myCommand.Parameters.Add("?Image", Me.rawData)

    Mysql.myCommand.ExecuteNonQuery()

    Mysql.myCommand.Parameters.Clear()

    MessageBox.Show("El Producto se ha guardado con éxito", "PRODUCTO GUARDADO!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

    Catch ex As Exception

    'Panel.registrarError(ex.Message & "(ProductosAm/GuardaNuevo)")

    'Respuesta = "Error al guardar, Reintente - \n" & ex.Message

    Mysql.myCommand.CommandText = "rollback"

    Mysql.myCommand.ExecuteNonQuery()

    MessageBox.Show("", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)

    Finally

    Mysql.myCommand.CommandText = "commit"

    Mysql.myCommand.ExecuteNonQuery()

    End Try

    End Sub

     

    ****** RUTINA PARA LEER LA IMAGEN DE LA BASE Y MOSTRARLA EN EL PICTUREBOX

    private Sub CargarImagen(CodBarras)

    sql = "select * from productos_imagenes where Cod_Barras = " & Me.txtCodBarras.Text

    Mysql.myCommand.CommandText = sql

    Mysql.myReader = Mysql.myCommand.ExecuteReader

    If Mysql.myReader.HasRows Then

    Mysql.myReader.Read()

    Me.pbImagen.Image = ImageManipulation.Bytes2Image(Mysql.myReader("imagen"))

    Mysql.myReader.Close()

    End If

    Mysql.myReader.Close()

    end sub

     

     

    ******* CON ESTO LOGRO GUARDAR IMÁGENES DE 300 X 220 INDEPENDIENTEMENTE DEL TAMAÑO DE LA IMAGEN DE ORIGEN PARA Q NO SEAN MUY PESADAS, EL TAMAÑO FINAL SE PUEDE MODIFICAR EN LA CLASE IMAGEMANIPULATION

     

    EN EL CASO DE UNA MODIFICACIÓN, EN MI CASO LO QUE HAGO ES BORRAR ESE REGISTRO Y REINSERTARLO CON LA NUEVA IMAGEN.

     

    ESPERO QUE LES SIRVA, FUNCIONA A LA PERFECCIÓN, LA IDEA ES DEVOLVER UN POQUITO DE TANTAS AYUDAS RECIBIDAS. SALUDOS.

     

     


    lunes, 25 de junio de 2012 22:54