HttpHandlerHistogramme.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.Drawing;
  11. using System.Drawing.Imaging;
  12. namespace CG67.FicheCollege
  13. {
  14. public class HttpHandlerHistogramme : IHttpHandler
  15. {
  16. public bool IsReusable
  17. {
  18. get { return true; }
  19. }
  20. public void ProcessRequest(HttpContext context)
  21. {
  22. try
  23. {
  24. const int ecartEntreBarre = 10;
  25. const int largeurBarre = 30;
  26. // recupération des parametres
  27. int largeur = Convert.ToInt32(context.Request["l"]);
  28. int hauteur = Convert.ToInt32(context.Request["h"]);
  29. //Color fond = Color.FromArgb(Convert.ToInt32(context.Request["f"]));
  30. Color fond = Color.White;
  31. int nbBarre = Convert.ToInt32(context.Request["nb"]);
  32. decimal[] valeurs = new decimal[nbBarre];
  33. Color[] couleurs = new Color[nbBarre];
  34. string[] legende = new string[nbBarre];
  35. decimal valeurMaxi = decimal.MinValue;
  36. decimal valeurMini = decimal.MaxValue;
  37. decimal moyenne = 0;
  38. // chargement des valeurs et détermination de la valeur maxi et mini (bien que cette dernière ne serve pas pour le moment)
  39. for (int i = 1; i < nbBarre + 1; i++)
  40. {
  41. valeurs[i - 1] = Convert.ToInt32(context.Request[string.Format("v{0}", i)]);
  42. couleurs[i - 1] = Color.FromArgb(Convert.ToInt32(context.Request[string.Format("c{0}", i)]));
  43. legende[i - 1] = context.Request[string.Format("t{0}", i)];
  44. if (i == 1)
  45. {
  46. valeurMaxi = valeurs[i - 1];
  47. valeurMini = valeurs[i - 1];
  48. }
  49. else
  50. {
  51. if (valeurs[i - 1] > valeurMaxi)
  52. valeurMaxi = valeurs[i - 1];
  53. if (valeurs[i - 1] < valeurMini)
  54. valeurMini = valeurs[i - 1];
  55. }
  56. moyenne += valeurs[i - 1];
  57. }
  58. moyenne = moyenne / nbBarre;
  59. moyenne = Math.Round(moyenne, 2);
  60. string legendeMoyenne = "Moyenne : " + moyenne.ToString();
  61. // calcul de l'échelle
  62. decimal echelle = (hauteur - 40) / valeurMaxi;
  63. Bitmap graphique = new Bitmap(largeur, hauteur);
  64. Graphics g = Graphics.FromImage(graphique);
  65. // affichage du fond d'écran
  66. SolidBrush pinceau = new SolidBrush(fond);
  67. g.FillRectangle(pinceau, 0, 0, largeur, hauteur);
  68. pinceau.Dispose();
  69. SolidBrush stylo = new SolidBrush(Color.Black);
  70. Font police = new Font("Arial", 10, FontStyle.Bold);
  71. // affichage des barres
  72. for (int i = 0; i < nbBarre; i++)
  73. {
  74. pinceau = new SolidBrush(couleurs[i]);
  75. g.FillRectangle(pinceau, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 20 - valeurs[i] * echelle), largeurBarre, (float)(valeurs[i] * echelle));
  76. g.DrawString(valeurs[i].ToString(), police, stylo, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 35 - valeurs[i] * echelle));
  77. pinceau.Dispose();
  78. g.DrawString(legende[i], police, stylo, ecartEntreBarre + ((largeurBarre + ecartEntreBarre) * i), (float)(hauteur - 20));
  79. }
  80. stylo.Dispose();
  81. // Affichage de la ligne moyenne
  82. Pen greenPen = new Pen(Color.Green, 3);
  83. int x1 = 0;
  84. int y1 = (int)(hauteur - 20 - moyenne * echelle);
  85. int x2 = largeur;
  86. int y2 = (int)(hauteur - 20 - moyenne * echelle);
  87. // Draw line to screen.
  88. SolidBrush styloVert = new SolidBrush(Color.Green);
  89. g.DrawLine(greenPen, x1, y1, x2, y2);
  90. g.DrawString(legendeMoyenne, police, styloVert, (float)(450), (float)(y1 - 20));
  91. context.Response.StatusCode = 209;
  92. // Envoi de l'image dans le flux http de sortie
  93. context.Response.ContentType = "image/gif";
  94. graphique.Save(context.Response.OutputStream, ImageFormat.Gif);
  95. // libération des ressources
  96. styloVert.Dispose();
  97. graphique.Dispose();
  98. g.Dispose();
  99. }
  100. catch (Exception e)
  101. {
  102. context.Response.StatusCode = 510;
  103. context.Response.Write(e.Message.ToString());
  104. }
  105. }
  106. }
  107. }