Una de las partes que debemos tener mas presentes de Silverlight, es que el archivo se descarga del lado del cliente y todo funciona desde ahí, por lo mismo es que hay algunas funciones que por seguridad serán restingidos, uno de los mas importantes es la falta de acceso a archivos del sistema de una forma un tanto fácil, para ello se encuentra una clase genial llamada OpenFileDialog, esta clase será muy útil en este ejercicio.
Después de comenzar con un proyecto en blanco, lo primero que dedes hacer es colocar un sencillo botón y una imagen en blanco para que la interfaz quede en XAML de la siguiente manera.
Y en el evento clic del botón colocaremos el siguiente código.
private void btnAbrir_Click(object sender, System.Windows.RoutedEventArgs e) { OpenFileDialog dialogo = new OpenFileDialog(); dialogo.Multiselect = false; dialogo.Filter = "jpg (*.jpg)|*.jpg"; dialogo.FilterIndex = 1; bool? userClickedOK = dialogo.ShowDialog(); if (userClickedOK == true) { System.IO.Stream archivo = dialogo.File.OpenRead(); BitmapImage bi = new BitmapImage(); bi.SetSource(archivo); imgControl.Source = bi; archivo.Close(); } } |
Ok, ya teniendo el código puedes ver que llamando al OpenFileDialog podrás acceder a los archivos de tu máquina, de ahí filtra la extensión que quieres buscar y no permitas la multiselección dado que tienes un solo elemento en donde guardar tu información, la cual por cierto obtienes y canalizas mediante un Stream, el cual va a dar a un BitmapImage y por último a tu objeto imagen.
El resultado sería algo así.
Ya que pudiste acceder y ver la imagen, entonces vas por la mitad del asunto, sigamos para que ahora exportes la imagen.
Para esto vas a añadir primero una clase que encontré (me gusta reconocer el trabajo de los demás, pero no recuerdo donde lo obtuve)
Descargar JPGUtil.cs
Ya que tienes la clase en tus manos insértala en tu proyecto o crea una nueva copia el código, como tu prefieras, la idea es tener algo así.
Como puedes ver, hace falta una referencia para que el proyecto pueda funcionar, es una .dll, su nombre es FJ.Core.dll (no pongo el link de descarga, pero si descargas el ejercicio al final del post ahí viene), eso soluciona el problema.
Ya que tu clase funciona correctamente, vamos a regresar al XAML y colocaremos un Canvas, así como texto, para que quede de la siguiente manera.
Y por último en el evento Clic del boton para exportar escribiremos el siguiente código
private void btnExportar_Click(object sender, RoutedEventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "JPEG Images | *.jpg"; dialog.DefaultExt = "jpg"; WriteableBitmap bitmap = new WriteableBitmap(contenedorImagen, new TranslateTransform()); if (dialog.ShowDialog() == true) { using (Stream stream = dialog.OpenFile()) { JPGUtil.EncodeJpg(bitmap, stream); } } } |
Donde lo que haces es usar una clase diferente, la clase SaveFileDialog y de la misma manera estás filtrando el tipo de archivo que vas a crear, después usando la clase que insertamos hace unos pasos, crearás una imagen y ahí ira a parar toda la información de tu control contenedor.
Espero que puedas disfrutarlo, yo lo hice cuando lo pude terminar.
Me ha venido muy bien el código, gracias
hola acabo de ver el codigo pero como seria guardar la imagen en un base de datos SQL SERVER
utilizando WCF
grac ias