Россия, Ухта |
Работа с изображениями в ASP.Net
Поддерживаемые форматы изображений
GDI+ поддерживает достаточно много форматов изображений, включая самые распространенные из них: JPEG, GIF, BMP и PNG. Полный набор форматов изображений содержится в структуре ImageFormat. Находящийся в памяти объект Bitmap можно сохранить в любом поддерживаемом формате, используя одну из перегруженных версий метода Save:
bmp.Save(outputStream, ImageFormat.Gif);
Когда вы пытаетесь записать изображение в выходной поток или дисковый файл, система ищет кодер для запрошенного формата. Этим кодером является модуль GDI+, преобразующий данные в указанный формат. Учтите, что кодер реализован в виде неуправляемого кода, функционирующего на платформе Win32. Как правило, кодер позволяет задать не только формат данных, но и дополнительные установки, такие, например, как степень сжатия изображения JPEG.
Создание круговой диаграммы
Проще всего рассмотреть создание круговой диаграммы на конкретном примере:
namespace SMPA { public partial class Diagram : System.Web.UI.Page { public void ProcessRequest(HttpContext context) { object o = context.Request["url"]; if (o == null) { context.Response.Write("No image found"); context.Response.End(); return; } string file = context.Server.MapPath((string)o); if (File.Exists(file)) { Bitmap bmp = draw(); context.Response.ContentType = "image/jpeg"; bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg); bmp.Dispose(); } else { context.Response.Write("No image found"); context.Response.End(); } } //Приступаем к непосредственному созданию диаграммы Bitmap draw() { string strTypesLegend = ""; string strTestsData = ""; //В данном пример данные для диаграммы передаются через сессии //и представляют собой две строки, в которых значения раздеены запятыми strTypesLegend = (string)Session["map"]; strTestsData = (string)Session["data"]; //формируем массивы исходных данных char[] str = strTestsData.ToCharArray(); int length = strTestsData.Length; int size = 1; for (int i = 0; i < length; ++i) { if (str[i] == ',') { ++size; } } float[] data = new float[size]; string d1 = ""; int j = 0; float sum = 0; for (int i = 0; i < length; ++i) { if ((str[i] != ',') & (i != length - 1)) { d1 += str[i]; } else { if (i == length - 1) { d1 += str[i]; } data[j] = Convert.ToInt64(d1); d1 = ""; sum += data[j]; ++j; } } // //массив исходных данных легенды диаграммы int leglength = strTypesLegend.Length; char[] chr = strTypesLegend.ToCharArray(); string[] legend = new string[size]; j = 0; for (int i = 0; i < leglength; ++i) { if ((chr[i] != ',') & (i != leglength)) { d1 += chr[i]; } else { legend[j] = "" + d1; d1 = ""; ++j; } if (i == leglength - 1) { legend[j] = "" + d1; }; } // // Для упрощения и большей наглядности, было решено выводить только 10 //значений данных, 9 наибольших и 1 - для всех оставшихся значений if (size > 10) { float sumoth = 0; for (int i = 9; i < size; i++) { sumoth += data[i]; } data[9] = sumoth; legend[9] = "other"; size = 10; } // Bitmap bmp = new Bitmap(500, 250); Graphics g = Graphics.FromImage(bmp); //задаем цвета секторов диаграммы Color[] clr = new Color[10]; clr[0] = Color.Red; clr[1] = Color.Blue; clr[2] = Color.Violet; clr[3] = Color.Green; clr[4] = Color.Gray; clr[5] = Color.Chocolate; clr[6] = Color.Coral; clr[7] = Color.Indigo; clr[8] = Color.GreenYellow; clr[9] = Color.Khaki; float startAngle = 0; g.Clear(Color.White); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Near; Font f = new Font("Times New Roman", 10); StringFormat sfr = new StringFormat(); sfr.Alignment = StringAlignment.Near; ; sfr.LineAlignment = StringAlignment.Near; int t = 0; //Рисуем сегменты for (int counter = 8; counter > 0; --counter ) for (int i = 0; i < size; ++i) { double dt = data[i] * 360 / sum; double prcnt = data[i] / sum * 100; //вычисляем угол очередного сегмента float sweepAngle = Convert.ToInt64(Math.Round(dt)); Rectangle rect1 = new Rectangle(/*20-counter*/0, 2*counter, 250, 150); if (counter == 1) { g.FillPie(new SolidBrush(clr[i]), rect1, startAngle, sweepAngle); } else { g.FillPie(new HatchBrush(HatchStyle.Percent50, Color.Black, clr[i]), rect1, startAngle, sweepAngle); } if ((counter == 8) || (counter == 1)) { g.DrawEllipse(new Pen(Color.Black, 1), rect1); } startAngle += sweepAngle; //Отрисовка легенды Rectangle rec = new Rectangle(280, i * 20, 250, 50); g.FillRectangle(new SolidBrush(clr[i]), new Rectangle(260,i*20,10,10)); g.DrawString(legend[i] + " - " +data[i]+" ("+ Math.Round(prcnt, 2) + "%)", f, new SolidBrush(Color.Black), rec, sf); } return bmp; } } }
Примеры диаграмм, сформированных на основе данного кода: