none
Error al tratar de convertir una imagen de un PictureBox a un array de Bytes RRS feed

  • Pregunta

  • Estoy tratando de guardar una imagen que tengo previamente cargada en un PictureBox en una base de datos de SqlServer, cuando escojo una imagen desde mi disco duro u otra ubicación la función que utilizo para convertir esa imagen a un stream de bytes funciona y se guarda en la BD satisfactoriamente pero si el origen de la imagen viene de un PictureBox me sale el sigte error:


    Silvio Diaz

    sábado, 26 de marzo de 2016 14:18

Respuestas

  • "silvio.dol" escribió:

    > cuando escojo una imagen desde mi disco duro u otra ubicación la función que
    > utilizo para convertir esa imagen a un stream de bytes funciona y se guarda
    > en la BD satisfactoriamente pero si el origen de la imagen viene de un PictureBox
    > me sale el sigte error:
    >
    > System.Runtime.InteropServices.ExternalException

    De acuerdo con el tipo de excepción que estás obteniendo, no me queda más que pensar que el objeto Image que le estás pasando a la función ImagenToByte se guardó con un formato de imagen que no es el suyo, tal y como se indica en las dos únicas excepciones que puede desencadenar el método Image.Save.

    La función ImagenToByte que estás utilizando, podría ser del todo correcta si en lugar de devolver un valor System.Object devolviera una matriz de bytes, pero deseas aprovechar que devuelva un objeto DbNull.Value si el valor del parámetro especificado es Nothing, cuestión ésta que entiendo deberías de hacer posteriormente en el código que llama a la función ImagenToByte.

    Revisa bien el formato que tiene la imagen que le has asignado al control PictureBox, que según comentas es su objeto Image el que le estás pasando a la función, porque el problema NO ES de la función, ya que ésta te está diciendo que algo no está bien en la image. Por cierto, no has indicado el valor que le pasas a la función ImagenToByte, por lo que quiero creer que es el valor de la propiedad Image del control PictureBox:

       Dim by As Byte() = DirectCast(ImagenToByte(PictureBox1.Image), Byte())

    Si lo crees oportuno, intenta obtener la matriz de bytes mediante el método ConvertTo de un objeto System.Drawing.ImageConverter, para ver si no obtienes el mensaje de error que estás obteniendo:

        Friend Shared Function ImagenToByte2(ByVal img As Image) As Byte()
            Return DirectCast(New ImageConverter().ConvertTo(img, GetType(Byte())), Byte())
        End Function

    Cuando observes si funciona, le haces los cambios para que devuelve un valor System.Object, aunque yo no soy partidario de hacerlo porque en el código llamador tendrías que verificar si el valor devuelto es una matriz de bytes o un valor DbNull.Value y hacer la conversión oportuna mediante los operadores CType o DirectCast, salvo que el valor devuelto también se lo asignes a una variable declarada con el tipo System.Object, lo cual no me parece una decisión demasiado acertada porque para algo se "inventaron" los restantes tipos de datos por referencia que heredan directa o indirectamente de System.Object.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    lunes, 28 de marzo de 2016 15:21
    Moderador

Todas las respuestas

  • Hola:

     Recuerda que debes de tomar la imagen del PictureBox, en tu código:

     If(Not IsNothing(pImagen.Image))Then

    ....


    Saludos desde Monterrey, Nuevo León, México!!!

    sábado, 26 de marzo de 2016 14:27
  • "silvio.dol" escribió:

    > cuando escojo una imagen desde mi disco duro u otra ubicación la función que
    > utilizo para convertir esa imagen a un stream de bytes funciona y se guarda
    > en la BD satisfactoriamente pero si el origen de la imagen viene de un PictureBox
    > me sale el sigte error:
    >
    > System.Runtime.InteropServices.ExternalException

    De acuerdo con el tipo de excepción que estás obteniendo, no me queda más que pensar que el objeto Image que le estás pasando a la función ImagenToByte se guardó con un formato de imagen que no es el suyo, tal y como se indica en las dos únicas excepciones que puede desencadenar el método Image.Save.

    La función ImagenToByte que estás utilizando, podría ser del todo correcta si en lugar de devolver un valor System.Object devolviera una matriz de bytes, pero deseas aprovechar que devuelva un objeto DbNull.Value si el valor del parámetro especificado es Nothing, cuestión ésta que entiendo deberías de hacer posteriormente en el código que llama a la función ImagenToByte.

    Revisa bien el formato que tiene la imagen que le has asignado al control PictureBox, que según comentas es su objeto Image el que le estás pasando a la función, porque el problema NO ES de la función, ya que ésta te está diciendo que algo no está bien en la image. Por cierto, no has indicado el valor que le pasas a la función ImagenToByte, por lo que quiero creer que es el valor de la propiedad Image del control PictureBox:

       Dim by As Byte() = DirectCast(ImagenToByte(PictureBox1.Image), Byte())

    Si lo crees oportuno, intenta obtener la matriz de bytes mediante el método ConvertTo de un objeto System.Drawing.ImageConverter, para ver si no obtienes el mensaje de error que estás obteniendo:

        Friend Shared Function ImagenToByte2(ByVal img As Image) As Byte()
            Return DirectCast(New ImageConverter().ConvertTo(img, GetType(Byte())), Byte())
        End Function

    Cuando observes si funciona, le haces los cambios para que devuelve un valor System.Object, aunque yo no soy partidario de hacerlo porque en el código llamador tendrías que verificar si el valor devuelto es una matriz de bytes o un valor DbNull.Value y hacer la conversión oportuna mediante los operadores CType o DirectCast, salvo que el valor devuelto también se lo asignes a una variable declarada con el tipo System.Object, lo cual no me parece una decisión demasiado acertada porque para algo se "inventaron" los restantes tipos de datos por referencia que heredan directa o indirectamente de System.Object.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    lunes, 28 de marzo de 2016 15:21
    Moderador