Cargar Imagen capturada de Windows Phone 7.5
-
jueves, 28 de junio de 2012 14:34
Hola,
Tengo este código:
// Evento para confirmar la captura y pasarla a un objeto imagen void cameraCaptureTask_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { MessageBox.Show(e.ChosenPhoto.Length.ToString()); System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(); bmp.SetSource(e.ChosenPhoto); selectedImage.Source = bmp; // Guardo la ruta de la imagen App.vRutaImagen = bmp.UriSource.ToString(); }
selectedImage.Source = new BitmapImage(new Uri(App.vRutaImagen, UriKind.RelativeOrAbsolute));
}
// Visualizamos la foto capturada private void loadButton_Click(object sender, RoutedEventArgs e) { try { cameraCaptureTask.Show(); } catch (System.InvalidOperationException ex) { MessageBox.Show("An error occurred."); } }
El problema es que cuando dispara una foto la cámara de Windows Phone el control de Image no carga la imagen captura al instante de disparar.
Mi problema mas grande es que dispongo de un pc muy bajo para hacer pruebas en el emulador y tengo que hacer un codigo preciso.
Por favor, alguien me podria encontrar la errata de mi código.
Gracias.
Heimdal
Todas las respuestas
-
jueves, 28 de junio de 2012 19:01
Hola, creo que el fallo está en que asignas 2 veces la propiedad Source del selectedImage que tienes, y la segunda asignación es la que está haciendo que no se muestre nada, ya que no estás guardando la imagen.
Un saludo.
- Editado Juan Fco. Miranda jueves, 28 de junio de 2012 19:06
-
jueves, 28 de junio de 2012 19:17
Hola, D. Juan que haces por mi barrio:)
Creo que no es lo que dices te cuento fijate que la que sobraría seria el primer Source pues el segundo siempre asignaría la ruta almacenada en una variable de cadena llamada vRutaImagen.
En fin, que opinas.
Heimdal
-
jueves, 28 de junio de 2012 19:20Hola, jejeje, pues aquí andamos. Y seguro que es la segunda, porque le estás asignando la ruta de una imagen que no existe ni en tu IsolatedStorage ni en tu paquete XAP, ya que no estás guardando por ninguna parte la imagen que has capturado, y por eso es por lo que no te muestra la imagen.
-
jueves, 28 de junio de 2012 19:26
Te cuento la lógica todo esta en memoria hasta que el usuario pulse el botón guardar entonces es cuando se guarda en IsolatedStorage. Mientras le guardo la ruta a la imagen capturada en vRutaImagen. Supongo que el primer Source se me colo.
Pero bueno sea lo que sea el problema es otro entiendo yo pues si te fijas de nuevo ambas asignarian lo mismo. Es como cargar dos veces una imagen pero de dos formas diferente.
Sugiero que pruebes algun código parecío y lo pruebes, claro esta cualquier persona que desee ayudarme.
Oye gracias.
Heimdal
-
jueves, 28 de junio de 2012 19:44
Te aseguro que el problema está ahí. ¿Has comprobado lo que te devuelve esta llamada?
bmp.UriSource.ToString();
A mi por lo menos me devuelve una cadena vacía.
-
jueves, 28 de junio de 2012 19:51
Probablemente tengas razón ten en cuenta que yo no lo puedo probar solo puedo implementar o quitar lo que tu me digas y enviarte xap para que lo pruebes. No tengo ni Móvil Windows Phone ni emular que me de una prueba de funcionamiento.
Por favor si no es mucho la molestia reescribe aqui el código de arriba y me dices que hago. Aunque entiendo que dices que quite el segundo Source pero entonces tengo otro problema y es como guardo la ruta al archivo imagen capturada por la cámara.
En fin tengo el problema de carga en el control image y guardar la ruta en la base de datos.
Heimdal
- Editado Andy98_ jueves, 28 de junio de 2012 19:52
-
jueves, 28 de junio de 2012 20:21
Es que hay que tener en cuenta que ¿cómo vas a sacar la uri del bitmap que capturas si sólo está en memoria? Tendrías que guardar la imagen o bien en la librería de imágenes del sistema o en el IsolatedStorage de tu aplicación.
Para guardarla en el IsolatedStorage podrías usar algo así:
private void CameraCaptureTaskCompleted(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { var bitmap = new BitmapImage(); bitmap.SetSource(e.ChosenPhoto); imgPicture.Source = bitmap; using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication()) { using (var fileStream = isoStorage.CreateFile("Image.jpg")) { Extensions.SaveJpeg(new WriteableBitmap(bitmap), fileStream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100); } } } else if (e.TaskResult == TaskResult.Cancel) MessageBox.Show("Operation was cancelled", "Photo not captured", MessageBoxButton.OK); else MessageBox.Show("Error while capturing photo:\n" + e.Error.Message, "Fail", MessageBoxButton.OK); }Y guardar sólo el nombre que le des a la imagen en lugar de la ruta completa, luego sólo habría que volver a leer la imagen del isolatedStorage cuando haga falta.
- Editado Juan Fco. Miranda jueves, 28 de junio de 2012 20:21
- Editado Juan Fco. Miranda jueves, 28 de junio de 2012 20:23
-
jueves, 28 de junio de 2012 20:28
Lo miro y lo adapto es que te cuento el usurio podria pensarselo y no querer al final guardar por lo tanto no tiene sentido que lo guarde primero los datos y despues ante su rechazo tengo que volver a destruir los datos guardado. Mejor trabajar en memoria que cubre mejor esta posibilidad. Ademas sigue el griterio de o todo o nada que es lo que yo suelo seguir.
De todas formas lo miro por si es posible adaptarlo sino seguro que tu mismo de diras algo.
Gracias y perdon por la paliza pero es que busco una forma donde trabajo con la ruta a memoria y guardo al final cuando esta todo decidido por el usuario.
Heimdal
-
jueves, 28 de junio de 2012 20:53Pues entoces creo que tendrías que mantener la referencia a la imagen en memoria o podrías crearte un MemoryStream para guardarla hasta que el usuario confirme y entonces ya la guardas en el isolatedstorage.
-
viernes, 29 de junio de 2012 6:19
Vamos a ver Juan, vayamos a pasito:
1. Deseo capturar la ruta a la imagen que se acaba de hacer con la cámara, la ruta solo puede ser un string por que despues va a ir a una base de datos. Dime por favor si este código lo hace:
System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(); bmp.SetSource(e.ChosenPhoto); //selectedImage.Source = bmp; // Guardo la ruta de la imagen esta variable es un string App.vRutaImagen = bmp.UriSource.ToString();2. Una vez que tenemos la ruta guardada que es lo mas importante entonces manejamos la ruta (uri) segun nos sea necesaria para otros controles. En este caso uso este código para cargar la imagen en el control image:
selectedImage.Source = new BitmapImage(new Uri(App.vRutaImagen, UriKind.RelativeOrAbsolute));
Pues se que algo no esta bien en el código pues ambos lo hemos comprobado pero ¿que es?, pues el código parece que si trabaja aunque en real en el móvil, NO.
Lo mejor es hacer una prueba y probarla directamente en el móvil. ¿No crees?
Heimdal
- Editado Andy98_ viernes, 29 de junio de 2012 6:20
-
viernes, 29 de junio de 2012 10:38
Acabo de comprobar que bmp.UriSource.ToString() como tu decias no obtiene nada es una cadena vacia. Pero he probado esto y aunque si tiene la ruta de la foto no la carga:
selectedImage.Source = new BitmapImage(new Uri(e.OriginalFileName.ToString(), UriKind.RelativeOrAbsolute));
Que raro, no?
Heimdal
- Marcado como respuesta Andy98_ sábado, 30 de junio de 2012 21:31
-
viernes, 29 de junio de 2012 11:14
Pues sí, es un poco raro, pero fíjate la ruta que saca la propiedad e.OriginalFileName, es una ruta un tanto extraña. ¿Y no podrías mantener la imagen en memoria y justo cuando la guardes en el isolatedstorage guardar la ruta?
-
viernes, 29 de junio de 2012 11:26Es que Juan desde el principio uso Linq y no IsolatedStorage. En fin estoy echo un lio principalmente por no poder experimentar mis pruebas.
Heimdal
-
viernes, 29 de junio de 2012 11:42¿Usas LinqToSql? ¿Y dónde guardas la imagen? ¿Dentro de la base de datos?
-
viernes, 29 de junio de 2012 11:45Eso intento, vamos intento guardar su ruta (string). He visto por ahi que se guarda el binario pero es un lio de momento para mi.
Heimdal
-
viernes, 29 de junio de 2012 11:50Pues yo creo que tendrías que guardar la imagen físicamente bien en la librería de medios, en el isolatedstorage o incluso en la base de datos como array de bytes, porque si no, juraría que la imagen que captura la cámara se pierde.
-
viernes, 29 de junio de 2012 11:59
Eso es lo que a mi me faltaba saber. Concretemos:
Para obtener la imagen hay dos medios:
1. Deseo capturar una imagen de la cámara (Yo pensaba que al capturarla la guarda automaticamente en el álbum).
2. El álbum tiene ya guardada las imagenes con lo cual es cargar la imagen.
Mi objetivo es guardar la ruta en una base de datos una vez guardada la foto (en todos los casos en el álbum del móvil)
Entonces,
Supongo que primero tengo que guardar las capturas al álbum pues me dices que no lo hace el móvil. Y despues obtener la ruta a esa foto para guardarla lo que no se si se puede hacer, dime que se puede hacer de lo que deseo hacer.
Heimdal
-
viernes, 29 de junio de 2012 12:31
Ya he conseguido:
1. Cargar la ruta del álbum en el control image desde mi variable string. Por lo tanto ya puedo guardar la ruta a la db.
2. Además cuando vuelvo a la página y la cargo desde mi variable string tambien carga la imagen.
Esto resuelve todo con respecto al álbum no con la captura pues supongo que la captura debe ir al álbum y despues ese archivo del álbum sera seleccionado para guardar a la db.
Pero tengo un problema en el camino. Cargo desde una variable string la foto sin embargo desde la db al binding del control image no carga. Estoy justo con esto para ver que pasa.
Heimdal

