Principales respuestas
Grabar una imagen en disco

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
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....
- Marcado como respuesta Maximiliano Gil viernes, 5 de enero de 2018 14:20
-
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
- Marcado como respuesta Maximiliano Gil 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
-
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.
-
-
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
-
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
-
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
-
-
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....
- Marcado como respuesta Maximiliano Gil viernes, 5 de enero de 2018 14:20
-
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
- Marcado como respuesta Maximiliano Gil 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