Scour Design. Tutoriales de Flash, ActionScript, CSS, Photoshop, ImageReady...

\n"; } } } lecturas();

          


Imágenes en tiempo de ejecución (Visual C#)

      

Autor: Carlos Carmona

Crear imágenes dinámicamente en .NET a partir de unos valores dados nos permite crear un sistema de estadísticas visuales con barras, por ejemplo. Lo lógico sería traer los valores a representar de una consulta de Base de Datos, pero para este ejemplo usaremos 3 DropDownList con valores del 1 al 10.

Vamos a usar 2 páginas aspx o WebForm, una que enviará los datos a evaluar y posteriormente cargará la imagen, y la otra que será la que cree la imagen en sí.

Vamos con la primera; creamos un nuevo WebForm al que añadiremos 3 DropDownList con valores del 1 al 10, un botón que no tendrá código alguno, simplemente lo necesitamos para provocar el post, y un label. Algo así:

Controles que usaremos

Bien, en el evento Page_Load de la página solo tenemos que recoger los valores de las listas y pasarselos a la otra página:

  1. private void Page_Load(object sender, System.EventArgs e)
  2. {
  3. Single v1, v2, v3;
  4. //Recogemos los valores de las listas.
  5. try
  6. {
  7. v1 = Convert.ToSingle(val1.SelectedValue);
  8. }
  9. catch
  10. {
  11. v1 = 0;
  12. }
  13. try
  14. {
  15. v2 = Convert.ToSingle(val2.SelectedValue);
  16. }
  17. catch
  18. {
  19. v2 = 0;
  20. }
  21. try
  22. {
  23. v3 = Convert.ToSingle(val3.SelectedValue);
  24. }
  25. catch
  26. {
  27. v3 = 0;
  28. }
  29. //Creamos la etiqueta img que contendrá la imagen.
  30. //la ruta de la imagen 'src' será la página que
  31. //creará la imagen, a la que le pasamos las variables
  32. //vía get
  33. Label1.Text = "<img src=\"crea_imagen.aspx?v1=" + v1 + "&v2=" + v2 +
    "&v3=" + v3 + "\" width=\"200\" height=\"200\">";
  34. }

Bien, ahora vamos con la otra página, '/articulos/tutoriales/net/crea_imagen.html'. Ésta página no tendrá más que código en el evento Page_Load:

  1. private void Page_Load(object sender, System.EventArgs e)
  2. {
  3. //Dreclaramos el objeto BitMap y Graphic
  4. Bitmap objBitmap = new Bitmap(200,200);
  5. Graphics objGraphic = Graphics.FromImage(objBitmap);
  6. //Declaramos las barras asignándoles un color
  7. SolidBrush TurquoiseBrush = new SolidBrush(Color.Turquoise);
  8. SolidBrush VioletBrush = new SolidBrush(Color.Violet);
  9. SolidBrush SalmonBrush = new SolidBrush(Color.Salmon);
  10. //Definimos el fondo de color blanco
  11. SolidBrush whiteBrush = new SolidBrush(Color.White);
  12. //Con esto dibujaremos 2 líneas, a la izquierda una
  13. //y otra inferior para representar un eje de coordenadas.
  14. //Las líneas serán de color rojo (Tomato) y de grosor 5
  15. Pen TomatoPen = new Pen(Color.Tomato, 5);
  16. //Aquí es donde creamos el fondo, de color
  17. //blanco tal y como especificamos anteriormente
  18. objGraphic.FillRectangle(whiteBrush, 0, 0, 200, 200);
  19. //En estas 2 líneas es donde dibujamos el eje
  20. //de coordenadas antes mencionado
  21. objGraphic.DrawLine(TomatoPen, new Point(0,200), new Point(200,200));
  22. objGraphic.DrawLine(TomatoPen, new Point(0,0), new Point(0,200));
  23. //Variables para calcular el tamaño de cada columna
  24. Single sngMayorValor, sngMayor1, sngMayor2, sngMayor3;
  25. Single valor1, valor2, valor3;
  26. //Recogemos los valores de las listas desplegables
  27. //que hemos recibido por get
  28. valor1 = Convert.ToSingle(Request.QueryString["v1"]);
  29. valor2 = Convert.ToSingle(Request.QueryString["v2"]);
  30. valor3 = Convert.ToSingle(Request.QueryString["v3"]);
  31. //Comprobamos cual es la más grande, que tendrá un tamaño
  32. //del 100%, y las otras 2 serán más pequeñas en proporción
  33. //a la diferencia de tamaño con respecto a la mayor.
  34. if (valor1 > valor2)
  35. sngMayorValor = valor1;
  36. else
  37. sngMayorValor = valor2;
  38. if (valor3 > sngMayorValor)
  39. sngMayorValor = valor3;
  40. if (sngMayorValor == 0)
  41. sngMayorValor = 1;
  42. sngMayor1 = (valor1 / sngMayorValor) * 190;
  43. sngMayor2 = (valor2 / sngMayorValor) * 190;
  44. sngMayor3 = (valor3 / sngMayorValor) * 190;
  45. //Con todos los cálculos realizado, creamos ahora sí
  46. //las columnas de la imagen
  47. objGraphic.FillRectangle(TurquoiseBrush, 10, 194 - sngMayor1, 55, sngMayor1);
  48. objGraphic.FillRectangle(VioletBrush, 70, 194 - sngMayor2, 55, sngMayor2);
  49. objGraphic.FillRectangle(SalmonBrush, 130, 194 - sngMayor3, 55, sngMayor3);
  50. //Definimos el tipo de fichero
  51. Response.ContentType = "image/gif";
  52. //Y finalmente lo guardamos
  53. objBitmap.Save (Response.OutputStream, ImageFormat.Gif);
  54. }

Y con esto ya está operativo nuestro sistema gráfico de estadísticas, veamos algunos ejemplos:

Ejemplo PrimeroEjemplo SegundoEjemplo Tercero

Como se ve, la columna de mayor valor siempre ocupará el 100% de la longitud, y las otras 2 serán proporcionales con respecto a esta.

Espacio de nombre requerido:

  1. using System.Drawing;
  2. using System.Drawing.Imaging;

Para más información consulte la referencia del MSDN.

Scour Design ™ Todos los Derechos Reservados © Carlos Carmona Xhtml 1.1 Strict Válido!CSS Nivel 2 Válido! Nivel Triple-A de Conformidad con las Directrices de Accesibilidad Web (WAI)