none
Borrar del disco duro una imagen cargada en un picturebox RRS feed

  • Pregunta

  • Hola a todos, de antemano gracias por la información que me puedan brindar. Tengo una aplicación (hecha en Vb.net 2010 ),  tengo un modulo de productos, que contiene un datagridview a medida que el usuario se desplaza por la filas en un PICTUREBOX cambiando la imagen del producto en caso de no tener imagen el usuario puede seleccionar la imagen (para el producto). El usuario selecciona una imagen de su pc y no importa el nombre que el usuario le ponga, yo guardo la imagen en mi carpeta raiz del proyecto y le coloco AL NOMBRE DE LA IMAGEN el codigo del producto que selecciono. Mi problema radica en que la primera vez que el asigna la imagen no hay problema pero SI EL USUARIO quisiera actualizar la imagen del producto, no me permite borrar el archivo para colocar la nueva imagen con ese nombre. ¿Como podría soluconar esto? 

    private sub imagen()

    Dim foto As String = ""

    OpenFileDialog1.InitialDirectory = main.ruta & "Imagenes"
    OpenFileDialog1.Filter = "Imágenes JPG(*.jpg)|*.jpg|Imágenes PNG(*.png)|*.png" 'Todos los formatos (*.*)|*.*"

       If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then

           foto = OpenFileDialog1.FileName.ToString

           lineas = Split(foto, ".") 'esta variable me permite saber que extension tiene el archivo .jpeg, .png etc

           Dim imagen As New Bitmap(New Bitmap(foto), 150, 150)

           Try
                imagen.Save(ruta & "Imagenes\" CODIGO_PRODUCTO "." & lineas(1), System.Drawing.Imaging.ImageFormat.Png)
                        
                ruta_imagen  = ruta & "Imagenes\" CODIGO_PRODUCTO "." & lineas(1) ' Guardo esto en mi BD para saber donde esta la foto
           

    'he investigado un poco y encuentro que vb.net no permite borrar las fotos que el carga durante la ejecucion del proyecto solo las puedo borrar despues que finalizo la aplicacion. 

           Catch
                    
           End Try

     end sub               

    lunes, 28 de mayo de 2012 4:07

Respuestas

  • hola

    aqui se planteo el mismo tema

    http://social.msdn.microsoft.com/Forums/es-ES/winformses/thread/c4cbaf74-1f96-48e6-8556-e9db71655117

    como cargar una imagen para que esta no quede bloqueada por el control y puedas eliminarla luego

    usa algo como ser

    Using stream As New StreamReader("C:\imagen.jpg")
    
        PictureBox1.Image = Image.FromStream(stream.BaseStream)
    
    End Using


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    lunes, 28 de mayo de 2012 4:34
  • Hola, prueba esto

        ' Devuelve la imagen y libera el enlace con el archivo
        Private Function Imagen(Archivo As String) As Image
    
            Try
                Using img As Image = Image.FromFile(Archivo)
    
                    Dim Foto As Image = New Bitmap(img.Width, img.Height)
                    Using g As Graphics = Graphics.FromImage(Foto)
                        g.DrawImage(img, 0, 0)
    
                        Return Foto
    
                    End Using
                End Using
    
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            End Try
    
        End Function

    Adaptalo a tu proyecto

    Saludos

    • Marcado como respuesta junix007 lunes, 28 de mayo de 2012 17:21
    lunes, 28 de mayo de 2012 9:07

Todas las respuestas

  • hola

    aqui se planteo el mismo tema

    http://social.msdn.microsoft.com/Forums/es-ES/winformses/thread/c4cbaf74-1f96-48e6-8556-e9db71655117

    como cargar una imagen para que esta no quede bloqueada por el control y puedas eliminarla luego

    usa algo como ser

    Using stream As New StreamReader("C:\imagen.jpg")
    
        PictureBox1.Image = Image.FromStream(stream.BaseStream)
    
    End Using


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    lunes, 28 de mayo de 2012 4:34
  • Hola, prueba esto

        ' Devuelve la imagen y libera el enlace con el archivo
        Private Function Imagen(Archivo As String) As Image
    
            Try
                Using img As Image = Image.FromFile(Archivo)
    
                    Dim Foto As Image = New Bitmap(img.Width, img.Height)
                    Using g As Graphics = Graphics.FromImage(Foto)
                        g.DrawImage(img, 0, 0)
    
                        Return Foto
    
                    End Using
                End Using
    
            Catch ex As Exception
                MsgBox(ex.Message)
                Return Nothing
            End Try
    
        End Function

    Adaptalo a tu proyecto

    Saludos

    • Marcado como respuesta junix007 lunes, 28 de mayo de 2012 17:21
    lunes, 28 de mayo de 2012 9:07
  • Muchas gracias por su ayuda, pero aun no he resuelto el problema. Yo quiero borrar la imagen de la carpeta donde se encuentra el archivo y cuando intento la sugerencia de TONIAG me lanza un error que dice. 

    El proceso no tiene acceso al archivo 'ruta_de_la_imagen' porque está siendo utilizado por otro proceso.

    Yo quiero que el usuario cuando actualiza la imagen del producto se borre la anterior y se guarde la nueva, pero con el mismo nombre. Ejem: Si la imagen1 tiene el nombre del producto A001 quiero borrar esa imagen de la carpeta donde se encuentra y guardar la nueva imagen pero con ese mismo nombre y Vb.net no me lo permite :(

    lunes, 28 de mayo de 2012 16:51
  • Pues debería de funcionar, no estarás abriendo el archivo en otro lugar del proyecto?

    lunes, 28 de mayo de 2012 16:55
  • Prueba hacer el return fuera de los using. Supongo que sino los handles quedan abiertos.
    lunes, 28 de mayo de 2012 16:57
  • No, lo acabo de probar y puedes eliminar la imagen, debes de tener el archivo abierto en otra parte, prueba a crear un nuevo proyecto y prueba a ver que tal

    lunes, 28 de mayo de 2012 17:02
  • Los archivos los guardo en la carpeta raíz del proyecto. Y el usuario puede buscar en cualquier parte del disco duro una imagen .jpeg o .png Toniag la función que me diste no me permite borrar el archivo anterior porque dice que otro proceso lo esta usando.

    Luis XCII ya intente lo que me dijistes y es el mismo resultado.

    lunes, 28 de mayo de 2012 17:04
  • ¿Has asignado la imagen como te indica Leandro?

    Saludos,

    Javier J.


    Saludos, Javier J

    lunes, 28 de mayo de 2012 17:13
  •   If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then

           foto = OpenFileDialog1.FileName.ToString ' CON ESTA LINEA OBTENGO LA RUTA DEL ARCHIVO

           lineas = Split(foto, ".") ' ESPECIFICO QUE EXTENSIÓN ES .JPEG O .PNG

           Dim imagen_nueva As New Bitmap(New Bitmap(foto), 150, 150)

                    Try
                        PbImagen.Image = Imagen(ruta & "Imagenes\" CODIGO_PRODUCTO & "." & lineas(1)) ' UTILIZO LA FUNCION DE TONIAG TAL CUAL

                      imagen_nueva.Save(ruta & "Imagenes\" & CODIGO_PRODUCTO & "." &lineas(1),System.Drawing.Imaging.ImageFormat.Png)

                    Catch  

                    End Try

    End If

                            
    lunes, 28 de mayo de 2012 17:13
  • Y si haces esto,

          Try

             using imagen_nueva As New Bitmap(New Bitmap(foto), 150, 150)

                   PbImagen.Image = Imagen(ruta & "Imagenes\" CODIGO_PRODUCTO & "." & lineas(1)) ' UTILIZO LA FUNCION DE TONIAG TAL CUAL

                   imagen_nueva.Save(ruta & "Imagenes\" & CODIGO_PRODUCTO & "." & lineas(1),System.Drawing.Imaging.ImageFormat.Png)
             end using

         Catch  

         End Try

    intenta eliminar el archivo antes


    • Editado ToniAG lunes, 28 de mayo de 2012 17:22
    lunes, 28 de mayo de 2012 17:20
  • Muchas gracias a todos ya logre solucionarlo... Tenia que implementar la función que me dijo Toniag mas asignar la imagen como dijo Leandro Gracias Javier por recordarme asignar la imagen de esa forma. Gracias a todos :) (y)
    lunes, 28 de mayo de 2012 17:20
  • Prueba con StreamReader como te indicó Leandro.

    Saludos,

    Javier J.


    Saludos, Javier J

    lunes, 28 de mayo de 2012 17:21