Dot net In Blue

سه‌شنبه، فروردین ۰۸، ۱۳۸۵

در این مقاله بحث میکنیم که چطور در asp.net یک تصویر آفریده شده را بدون اینکه روی سرور save کنیم در صفحه وب خود به نمایش بگذاریم ،همینطور طریقه ذخیره سازی یک عکس آفریده شده در asp.net را بررسی خواهیم کرد ، دست آخر برنامه ای خواهیم نوشت که متنی را از QueryString بگیرید و با آن عکسی بسازد آن را نمایش دهد و ذخیره کند.

ابتدا بیایید کمی html به خاطر بیاوریم ، اگر هنوز هم یادمان باشد در گذشته میدانستم که با این کد میتوانیم یک عکس را در یک صفحه نمایش دهیم :

<img border="0" src="Images/pic.jpg" >

اینبار میخواهیم عکسی ر از یک فایل asp.net بخوانیم یعنی :

<img border="0" src=autoGen/pic.ASPX" >

خوب اولین سوالی که پیش می آید این است که حالا چه کاری است که ما لقمه رو دور سر خود بچرخوانیم مگر نمیتوانیم عکس را روی سرور آپلود کنیم ؟!؟

جواب این است : این روش فقط وقتی به کار میرود که ما بخواهیم عکسی را به صورت پویا تولید کنیم ، برای مثال شما تصور کنید که میخواهید نموداری از ارقام و اعداد بکشید و آن را ر صفحه وب نمایش دهید ، میخواهید به تناسب کاربر روی یک عکس چیزی بنویسید و به کاربر نمایش دهید ، میخواهید قسمتی از محتوای وب خود را به اتفاقا به صورت متنی هم ذخیره شده به دلایلی به عکس تبدیل کنید (مثلا فونت مخصوص ، عدم سرقت اطلاعات ، عدم به هم ریختگی هنگام پرینت ! ) و یا میخواهید عکس امنیتی تولید کنید که از فعالیت نام تعداد زیاد کاربر مجازی جلوگیری کنید.

در مثال های فوق میبینید که بسیار کار سختی است که عکس های لازم را تک تک به صورت آماده روی سرور نگهداری کنیم و در هنگام نیاز استفاده کنیم ، تولید پویای این تصاویر بسیار به صرفه تر است . در این مقاله قصد ندارم طریقه تولید یک عکس پویا را آموزش بدهم ، مقالات خوبی به فارسی درسایت iranasp.net و جود دارد که اتفاقا یکی از آنها را با نام "دستکاری تصاویر در دات نت" خود من نوشته ام . همینطور مقاله گرافيک در ASP.NET نیز میتواند دروازه ای برای ورود شما به دنیای گرافیک دات نتی باشد.

کد زیر در دات نت یک تصویر تولید میکند :

Bitmap mybmp =new System.Drawing.Bitmap(100,30);
 Graphics g = System.Drawing.Graphics.FromImage(mybmp);
 g.Clear(Color.Blue);
 Font myfont = new Font("Tahoma", 8, FontStyle.Bold);
 g.DrawString("I Love ASP.net ",myfont,Brushes.Yellow,9,8);
 Response.ContentType = "image/jpeg";
 mybmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

این کد را در قسمت Page_Load قرار دهید

private void Page_Load(object sender, System.EventArgs e)
 {
 //کد را اینجا بگذارید
}

فضای نام مورد نیاز به تور پیش فرض در ویژآل ایستدیو دات نت آورده شده است شما مطمئن شوید که فضا ی نام System.Drawing فراخوانی شده است.

حالا اگر این صفحه را اجرا کنید خواهید دید که با صفحه حاوی کد ها مانند عکس برخورد میشود ! یک عکس با پسوند ASPX !

در حقیقت این خط وظیفه این کار را به عهده میگیرد :

mybmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

اگر خواستید این عکس را روی سرور هم ذخیره کنید میتوانید خط بالا را به صورت زیر تغییر دهید :

mybmp.Save(Server.MapPath("result.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);

کد بالا میتواند عکس را با نام result.jpg روی سرور ذخیره کند .

و آما انچه نباید فراموش شود

mybmp.Dispose();
 g.Dispose();

که به آخر کد های بالا اضافه میشود .

و در اینجا بد نیست یک ایده به شما بدهم ، فرض کنید شما میخواهید چارت تاریخی خاص از فعالیتی خاص را از با استفاده از اطلاعات دیتابیس بکشید ، در این صورت شما میتوانید از کوری استرینگ برای انتقال این داده ها به برنامه تولید کننده عکس کمک بگیرید ، برنامه کامل زیر نوشته کوری استرینگ را منتقل میکند آن را هم نمایش میدهد و و هم ذخیره میکند !(فراموش نکنیم که این برنامه عکسی را که ذخیره کرده نمایش نمیدهد بلکه عکس در لحظه آفریده میشود . یعنی شما اگر خط 11 ام برنامه را حذف کنید دیگر تصویری ذخیره نمیشود ولی هنوز نمایش داده میشود و با حذف خط 10 ام تصویر ذخیره میشود ولی نمایش داده نمیشود !

string str = "No QueryString Make one like (.../test.aspx?Hello )";
 if(Request.QueryString.Count >0 ) str = Request.QueryString[0];
 Bitmap mybmp =new System.Drawing.Bitmap(300,30);
 Graphics g = System.Drawing.Graphics.FromImage(mybmp);
 g.Clear(Color.Blue);
 Font myfont = new Font("Tahoma", 8, FontStyle.Bold);
 g.DrawString(str,myfont,Brushes.Yellow,9,8);
 Response.ContentType = "image/jpeg";
 mybmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
 mybmp.Save(Server.MapPath("result.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);
 mybmp.Dispose();
 g.Dispose();

برنامه را اجرا کنید و از دات نت آبی لذت ببرید !