GDI+

Daha önce burada yapmış olduğum Anket uygulaması nasıl olurda pasta grafiği ile gösterilir dedim, böyleymiş.

Bitmap myB = new Bitmap(500, 400);
Graphics g = Graphics
.FromImage(myB);
g.Clear(Color
.White);
Rectangle hedRec = new Rectangle(0, 0, 500, 75
);
Rectangle hedRecShadow = new Rectangle(1, 1, 500, 75
);
Rectangle pieRec = new Rectangle(5, 100, 200, 200
);
StringFormat strF = new StringFormat
();
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint
.AntiAlias;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode
.AntiAlias;
strF.Alignment = StringAlignment
.Center;
XPathDocument pDoc = new XPathDocument(Server.MapPath("./App_Data/anket.xml"
));
XPathNavigator
nav = pDoc.CreateNavigator();
int toplamCevap = Convert.ToInt32(nav.Evaluate("count(/Anket/cevap)"
));
int toplamOy = Convert.ToInt32(nav.Evaluate("sum(/Anket/cevap)"
));
float angel = 0, sweep = 0, oran = 0
;
string header = nav.SelectSingleNode("Anket").GetAttribute("ad", ""
);
g.DrawString(header, new Font("arial", 20, FontStyle.Bold), Brushes
.Gray, hedRecShadow, strF);
g.DrawString(header, new Font("arial", 20, FontStyle.Bold), Brushes
.Goldenrod, hedRec, strF);
g.DrawLine(new Pen(Color.Black), 5, 75, 495, 75
);
XPathNodeIterator nodes = nav.Select("Anket/cevap"
);
int top = 125
;
while
(nodes.MoveNext())
{
   sweep = 360 * Convert
.ToSingle(nodes.Current.InnerXml) / toplamOy;
   g.FillPie(new SolidBrush(Color.FromName(nodes.Current.GetAttribute("renk", ""
))), pieRec, angel, sweep);
   oran = 100 * Convert
.ToSingle(nodes.Current.InnerXml) / toplamOy;
   g.DrawString("% " + oran.ToString("n"), new Font("arial", 9, FontStyle.Regular), Brushes.Black, 250
, top);
   g.FillRectangle(new SolidBrush(Color.FromName(nodes.Current.GetAttribute("renk", ""))), 320, (top - 6), 20, 20
);
   g.DrawString(nodes.Current.GetAttribute("text", ""), new Font("arial", 9, FontStyle.Regular), Brushes.Black, 355
, top);
   angel += sweep;
   top += 35
;
}
MemoryStream mem = new MemoryStream
();
myB.Save(mem, System.Drawing.Imaging.ImageFormat
.Gif);
Response.BinaryWrite(mem.ToArray());


sonuç:
pie
 

HatchBrush nesnesinin desen listesi 52 adet kadar. Her seferinde ne neydi hangisiydi derken tüm listeyi çıkartıp kaydettim.

Bitmap bmp = new Bitmap(500, 2800);
Graphics g = Graphics.FromImage(bmp);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
int y = 0;
string[] brushess = Enum.GetNames(typeof(HatchStyle));
foreach (string hatchstyle in Enum.GetNames(typeof(HatchStyle)))
{
   Rectangle rec = new Rectangle(0, y, 100, 40);
   HatchBrush ht = new HatchBrush((HatchStyle)Enum.Parse(typeof(HatchStyle), hatchstyle),    Color.White, Color.Black);
   g.FillRectangle(ht, rec);
   g.DrawString(hatchstyle, new Font("verdana", 12, FontStyle.Regular), Brushes.Red, 105, y);
   y += 50;
}
g.Dispose();
Response.ContentType = "image/png";
MemoryStream mem = new MemoryStream();
bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Png);
Response.BinaryWrite(mem.ToArray());

Eğer GDI+ kullanarak bir metni tam olarak hizalamak isterseniz,

Graphics g = panel1.CreateGraphics();
g.FillRectangle(new LinearGradientBrush(panel1.ClientRectangle, Color.WhiteSmoke, Color.SkyBlue, 90), panel1.ClientRectangle);
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
g.DrawString("center", new Font("verdana", 12, FontStyle.Bold), Brushes.Maroon, panel1.ClientRectangle, sf);

Ajax Control Toolkit Slider için örnek düşünürken jpeg sıkıştırması gayet güzel olur dedim.

using
System.Drawing;
using System.Drawing.Imaging;
.....
Bitmap bmp = new Bitmap(Server.MapPath("tempClock.jpg"
));
ImageCodecInfo codec = N'
;
foreach (ImageCodecInfo cod in ImageCodecInfo
.GetImageEncoders())
{
    if (cod.MimeType == "image/jpeg"
)
    codec = cod;
}
//long tipinde 0-100 arası
EncoderParameter Qpar = new EncoderParameter(Encoder.Quality,50L
);
//int tipinde 0-23 arası
EncoderParameter Rpar = new EncoderParameter(Encoder.RenderMethod,(int)EncoderValue
.RenderProgressive);
EncoderParameters Epars = new EncoderParameters(2
);
Epars.Param[0
] = Qpar;
Epars.Param[1
] = Rpar;
bmp.Save(Server.MapPath("Clock.jpg"
),codec,Epars);

EncoderValue Enumeration

Geçenlerde bir web proje için resim kırpma ve yeniden boyutlandırma gibi işlemleri yapmam gerekti. Asp.Net'in yapısı gereği illaki JavaScript kullanmak kaçınılmaz bir durum. Günümüzde de oturup deli gibi JavaScript yazılmaz. O yüzden JQuery' den yardım almaya karar verdim.

ClientSide işlemler için Jquery eklentisi olan Jcrop kullandım. Diğer eklentiler arasından en beğendiğim bu oldu. Geri kalan kısımları ile GDI+ ile hallettim.

image crop

Uygulama.