none
Grabar una imagen en disco RRS feed

  • Pregunta

  • Buenos días a todos. Tengo un problema con una rutina y he investigado hasta decir ya en Internet y aparentemente mi rutina es correcta, pero no funciona ni en VS-2015 ni en VS-2017. La rutina es para grabar un picturebox  en disco y la misma es:

            ' Si no existe el directorio Fotos, lo creamos
            Dim folder As String = Path.Combine(Application.StartupPath, "Fotos")
            If (Not Directory.Exists(folder)) Then
                Directory.CreateDirectory(folder)
            End If
            ' Grabar la foto
            If Not Foto.Image Is Nothing Then
                Try
                    ' Nombre del archivo.
                    Dim fileName As String = Path.Combine(folder, CI.Text + ".jpg")
                    ' Guardamos en disco la imagen existente en el control PictureBox, sobrescribiendo sin previo aviso.
                    Foto.Image.Save(fileName, Imaging.ImageFormat.Jpeg)
                Catch ex As Exception
                    ' Se ha producido un error.
                    MessageBox.Show(ex.Message)
                End Try
            End If

    La linea en negritas es la que arroja el error "Error genérico de GDI+" y como es de suponer las "ayudas" de Microsoft en la actualidad son mas desayuda que otra cosa.

    Alguien tendrá una idea del por qué sucede esto? Y antes de que hagan preguntas obvias, les digo, estoy en un PC con Windows 10, soy el administrador del mismo y tengo todos los permisos necesarios para hacer lo que desee en ese PC.

    También está el include necesario (Import System.IO). Agradezco cualquier ayuda o información sobre el tema.


    MGilt

    jueves, 4 de enero de 2018 15:15

Respuestas

  • Siento q no te haya funcionado pero lo cierto es q tiene todo el sentido del mundo sobretodo ven Windows 7,8 y 10 donde aunque seas el administrador por seguridad todos los programas se ejecutan con un mínimo de permisos según la configuración del servicio de seguridad y su nivel.

    Respecto a la pila de llamadas no da ningún info relevante excepto por la sub orden del sabe que usa un encierro.

    Podrías probar a guardar icono png o BMP y revisaremos la configuración del picture para.ver q todo esté ok por lo q pido pasteles las propiedades q hayas alterado en diseño.

    Otra prueba q haremos es cambiar el.codigo así:

    IMG AS Image = piccture.image

    IMG.SAVE....


    jueves, 4 de enero de 2018 23:15
  • Eso que me dices lo intenté ayer a última hora y funcionó, es decir, cambié el jpg por png y si lo graba, por lo que supongo es un error que algún día Microsoft lo verá y corregirá, gracias por todo y de todas maneras te doy mi voto como ayuda completada.

    MGilt

    viernes, 5 de enero de 2018 14:19

Todas las respuestas

  • El.codigo es correcto, por lo que el error está en el nombre de la imagen o bien la carpeta no existe o no tienes permisos para acceder a ella(prueba a iniciar como administrador el VB studio) , asegúrate de que la ruta es correcta y q la carpeta existe.

    • Propuesto como respuesta vyrcyrus_ jueves, 4 de enero de 2018 15:40
    jueves, 4 de enero de 2018 15:39
  • Creo que tu problema está en el nombre del folder, asegúrate que al final tenga una backslash("\"), con lo cual deberá quedar mas o menos así:

    folder="C:\MiCarpeta\Fotos\";

    Cosa que luego al agregar el nombre del archivo digamos myfoto.jpg, al unirlos quedará así:

    fileName=C:\MiCarpeta\Fotos\Tuarchivo.jpg".

    De otro modo quedaría así:

    fileName=C:\MiCarpeta\Fotos Tuarchivo.jpg", y como verás jamás encontrará esa ruta o nombre de archivo.

    Saludos.

    jueves, 4 de enero de 2018 15:52
  • Ese no es el problema la orden path Combine ánade los Slash al path

    jueves, 4 de enero de 2018 16:18
  • No se si analizaste mi código a profundidad, pero como veras, la rutina prevé: la creación del directorio si no existe, se usa Path.Combine(folder, CI.Text + ".jpg") para evitar conflictos de path. O sea, allí no está el error. Además por debug, comprobé que el path, era correcto

    MGilt

    jueves, 4 de enero de 2018 17:21
  • Podrías debug en el exception (variable ex) del try catch e ir mirando cada propiedad innerexception hasta q sea la última y postear el mensaje? Así sabremos exactamente q error da.

    Prueba tb en ejecutar va studio como administrador botón derecho ejecutar como administrador en el icono

    Saludos


    • Editado vyrcyrus_ jueves, 4 de enero de 2018 19:52
    jueves, 4 de enero de 2018 19:50
  • El error que da es "Error generico de GDI+", pero en el debug obtengo:

    No se controló System.Runtime.InteropServices.ExternalException
      ErrorCode=-2147467259
      HResult=-2147467259
      Message=Error genérico en GDI+.
      Source=System.Drawing
      StackTrace:
           en System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
           en System.Drawing.Image.Save(String filename, ImageFormat format)
           en TransPub.frmAfiliados.btnGba_Click(Object sender, EventArgs e) en C:\Users\mgil\Desktop\Desarrollos\Desktop\VB\TransPub\TransPub\Formas\Dependientes\frmAfiliados.vb:línea 358
           en System.Windows.Forms.Control.OnClick(EventArgs e)
           en System.Windows.Forms.Button.OnClick(EventArgs e)
           en System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
           en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
           en System.Windows.Forms.Control.WndProc(Message& m)
           en System.Windows.Forms.ButtonBase.WndProc(Message& m)
           en System.Windows.Forms.Button.WndProc(Message& m)
           en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
           en System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
           en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           en Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           en Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           en Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           en TransPub.My.MyApplication.Main(String[] Args) en :línea 81
           en System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           en System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           en System.Threading.ThreadHelper.ThreadStart()
      InnerException: 

    Y analizando todo esto, no me dice absolutamente nada


    MGilt

    jueves, 4 de enero de 2018 22:44
  • El ejecutar VS como administrador no tiene sentido, soy el administrador del PC, pero lo hice y el error continúa.

    MGilt

    jueves, 4 de enero de 2018 22:46
  • Siento q no te haya funcionado pero lo cierto es q tiene todo el sentido del mundo sobretodo ven Windows 7,8 y 10 donde aunque seas el administrador por seguridad todos los programas se ejecutan con un mínimo de permisos según la configuración del servicio de seguridad y su nivel.

    Respecto a la pila de llamadas no da ningún info relevante excepto por la sub orden del sabe que usa un encierro.

    Podrías probar a guardar icono png o BMP y revisaremos la configuración del picture para.ver q todo esté ok por lo q pido pasteles las propiedades q hayas alterado en diseño.

    Otra prueba q haremos es cambiar el.codigo así:

    IMG AS Image = piccture.image

    IMG.SAVE....


    jueves, 4 de enero de 2018 23:15
  • Eso que me dices lo intenté ayer a última hora y funcionó, es decir, cambié el jpg por png y si lo graba, por lo que supongo es un error que algún día Microsoft lo verá y corregirá, gracias por todo y de todas maneras te doy mi voto como ayuda completada.

    MGilt

    viernes, 5 de enero de 2018 14:19
  • Luego de seguir analizando el problema, la solución es "un pequeño olvido de Microsoft". Cuando se carga la imagen usando

    Picturebox1.Image = Image.FromFile(Txt)  ' Donde Txt es la ruta y nombre del archivo a cargar

    El archivo queda bloquedo

    Y cuando se intenta:

    Picturebox1.Image.Save(fileName, Imaging.ImageFormat.Jpeg)  'Donde fileName es la ruta y nombre del archivo

    da error porque está bloqueado. Es incomprensible el error "Error generico de GDI+", por eso seguiré diciendo que el que hace las ayudas de Microsoft no puede ser alguien con conocimientos de programación (O es un genio de la programación que supone todos tenemos su genialidad)

    Lo solucione usando una función que carga el archivo y lo libera:

    En donde se carga la imagen:

    PictureBox1.Image = Imagen(Txt)

    Y la función donde sesees colocarla (En el mismo form o en un .bas

        ' Devuelve la imagen y libera el enlace con el archivo
        Public 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

    Y aunque la función es un tanto "incomprensible" funciona


    MGilt

    viernes, 5 de enero de 2018 17:54