در قسمت اول مفاهیم GDI و +GDI را برسی ومقایسه نمودیم
(لینک مراجعه)
در قسمت دوم با ترسیمات پایه آشنا
شدیم(لینک مراجعه)
حال به کلاس ها و امکانات جالب و
کاربردی دیگر +GDI در ادامه می پردازیم.
Paths
مسیر ها از ترکیب خطوط ،مستطیل ها و منحنی ها
شکل می گیرند .تمام موارد زیر را می توان در یک مسیر استفاده نمود.
·
Lines
·
Rectangles
·
Ellipses
·
Arcs
·
Polygons
·
Cardinal spines
·
Bezier spines
در +GDI شی از جنس GraphicsPath
به شما اجازه می دهد تا مجموعه ای از موارد لیست بالا را در قالبی
واحد (مسیر) گردآوری
نمایید .و می توانید مسیر را با استفاده از متد DrawPath
از شی گرافیک رسم نمایید.

myGraphicsPath.AddLine (0, 0, 30, 20);
myGraphicsPath.AddEllipse (20, 20, 20, 40);
myGraphicsPath.AddBezier (30, 60, 70, 60, 50, 30, 100,
10);
myGraphics.DrawPath (myPen, myGraphicsPath);
.jpg)
و یا حتی قسمتی از مسیرتان یک رشته باشد به شکل
زیر
myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180);
myGraphicsPath.AddCurve(myPointArray, 3);
myGraphicsPath.AddString("a string in a path", 18,
myFontFamily,
0, 24, myPointF,
myStringFormat);
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110);
myGraphics.DrawPath(myPen, myGraphicsPath);
و خروجی آن به شکل زیر در خواهد آمد:
.jpg)
Brushes and Filled Shapes
یک مستطیل یا یک بیضی شامل خطوط بیرونی (مرزی)
درون می باشد .خطوط مرزی آن با Pen و درون آن با شی Brush پر می شود .+GDI
چندید کلاس Brush برای پر کردن
درون اشکال بسته دارد : SolidBrush و HatchBrush و TextureBrush و
LinearGradientBrush و PathGradientBrush همه کلاس هایی از این قبیل هستند
که از کلاس Brush ارث می برند.
.jpg)
·
Solid Brushes
با استفاده از این براش می توان داخل یک شکل
بسته را با یک رنگ پر نمود
SolidBrush mySolidBrush(Color.Blue);
myGraphics.FillEllipse(mySolidBrush, 0, 0, 60, 40);
·
Hatch Brushes
با استفاده از این براش می توان یک رنگ رو
زمینه و رنگی برای پس زمینه و همچنین سبک هاشور را برای پر کردن داخل شکلی
بسته مشخص نمود.
.jpg)
·
Texture Brushes
با استفاده از این براش می توان درون شکلی بسته
را با استفاده از الگوی ذخیره شده در فایلی نقشه بیتی
پر نمود.
.jpg)
·
Gradient Brushes که قبلاً توضیح داده شده است
.jpg)
Open and Closed Curves
در شکل زیر یکی از منحنی ها بسته و دیگری باز
می باشد.
.jpg)
منحنی بسته دارای ناحیه درونی است و می تواند
با یک براش پر شود.متد های زیربرای پر کردن منحنی های بسته به کار می رود .
FillRectangle و FillEllipse و FillPie و FillPolygon و
FillClosedCurve و FillPath و FillRegion هر کدام از این متد ها را صدا
بزنیم باید یکی از براش ها را برای آن به عنوان آرگو مان بفرستیم.
متد FillPie قسمت درونی یک کمان را با یک براش
خاص مشخص شده پر می کند این متد یه همراه متد DrawArc به کار می رود
myGraphics.FillPie(mySolidBrush, 0, 0, 140, 70, 0, 120);
myGraphics.DrawArc(myPen, 0, 0, 140, 70, 0, 120);
.jpg)
FillClosedCurve یک متد همراه است برای متد
DrawClosedCurve . هر دو متد به صورت اتو ماتیک با متصل کردن نقطه شروع و
پایان بک منحنی خالی یا پر بسته ایجاد می کند.
Point[]
myPointArray = new
Point[3] {
new Point(100,100),
new
Point(200, 200),
new Point(150,
300) };
myGraphics.DrawClosedCurve(myPen, myPointArray, 3);
myGraphics.FillClosedCurve(mySolidBrush, myPointArray,
3,FillModeAlternate)
یک ناحیه بخشی از صفحه نمایش است .ناحیه می تواند ساده(یک مستطیل) یا پیچیده باشد
(تر کیبی از چند ظلعی ها و منحنی های بسته ). در شکل زیر 2 ناحیه مشخص شده که یکی از
مستطیل و دیگری از یک مسیر گرافیکی حاصل شده است.
.jpg)
ناحیه معمولا برای چیدن (clipping) و یا آزمایش
برخورد (hit testing) .clipping محدود
کردن ترسیم را به محدوده خاصی از صفحه نمایش می گویند که معمولا قسمتی از
صفحه نمایش است که نیاز به بهنگام سازی دارد .hit testing
به عمل چک کردنی می گویند که آیا
ماوس در هنگام فشردن شدن دکمه اش روی ناحیه قرار دارد یا نه.
می توان ناحیه ها را به هم تقسیم یا با هم
اجتماع xor یا از هم کم کرد و
می توان مکمل گرفت.
در شکل زیر دو حاثل دو عملی که بر روی 2 ناحیه بالا انجام شده را می بینیم
.jpg)
و در اشکال زیر نیز حاصل 2 نمونه دیگر مشخص شده
است
.jpg)
با استفاده از متد FillRegion
می توان یک ناحیه را با براشی خاص
پر کرد.
myGraphics.FillRegion(mySolidBrush, myRegion);
Clipping
کلیپینگ ترسیم را به ناحیه معین محدود می کند
در شکل زیر متن "Hello" را در ناحیه ای
به شکل قلب محدود کرده است.
.jpg)
ناحیه می تواند از یک مسیر ایجاد شود و
مسیر می تواند یک متن یاشد در شکل زیر این کار صورت گرفته است.
.jpg)
برای ترسیم یک کلیپ از متد SetClip از شی گرفیک
باید استفاده نمود .مثال زیر یک خط را که در ناحیه مستطیلی کلیپ شده ترسیم
می کند.
Region myRegion(Rect(20, 30, 100, 50));
myGraphics.DrawRectangle(myPen, 20, 30, 100, 50);
myGraphics.SetClip(myRegion, CombineModeReplace);
myGraphics.DrawLine(myPen, 0, 0, 200, 200);
.jpg)
Antialiasing with Lines and Curves
وقتی که شما با +GDI کار می کنید و یک خط را می
خواهید رسم کنید فقط نقطه شروع و پایان را برای آن مشخث می کنید و بر روی
پیکسل هایی که در دستگاه مقصد باید روشن شود تا خط رسم شود کنترلی ندارید
اگر به صورت دقیقی تنها پیکسل های بین این دو نقطه روشن شود خط حاصله شکلی
به صورت زیر خواهد داشت.
.jpg)
با فعل سازی خاصیت Antialiased در ترسیم
خط می توان خطی ایجاد نمود که صاف
بنظر براشد و دارای زبانه های تیز نباشد.
.jpg)
در نگاهی دورتر این خط کاملا صاف ینظر
خواهد رسید . همین عمل را می توان بر روی منحنی و اشکال دیگر انجام داد.
.jpg)
myGraphics.SmoothingMode= SmoothingMode.AntiAlias;
myGraphics.DrawLine(myPen, 0, 0, 12, 8);
می توان این کار را حتی در ترسیم متن انجام
داد.
Images, Bitmaps, and Metafiles
همانطور که قبلا گفتیم +GDI تعدادی کلاس تهیه
نموده است که با استفاده از آن ها می توان بر روی تصاویر با فرمت های
متفاوت کار نمود همچنین کلاسی برای نگهداری تصاویر نقشه بیتی که پیاده سازی
آن پیچیده می باشد و همینطور کلاس دیگری به منظور ایجاد یک متافایل که می
تواند در حکم یک دستگاه خروجی منطقی
قرار گیرد و با ایجاد یک DC روی آن نتایج گرافیکی برنامه را روی متا
فایل ذخیره و در موقع مناسب محتوای این فایل را بر روی یک دستگاه فیزیکی
ارسال نمود.
انواع نقشه بیتی
:یک نقشه بیتی
آرایه ای است از بیت ها که رنگ هر
پیکسل را با قرار دادن شماره رنگش در خانه متناظر با همان پیکسل در آرایه
مستطیلی نقشه بیتی ذخیره می کند و
انواع مختلفی دارد .به عنوان مثال اگر هر پیکسل نمایش داده شود با 4 بیت
آنگاه این پیکسل فقط می تواند 16 رنگ را نگهداری کند جدول زیر سعی دارد تا
نوع های متفاوت نقشه بیتی را مشخص
کند.
|
Bits per pixel
|
Number of colors that can be assigned to a pixel
|
|
1
|
2^1 = 2
|
|
2
|
2^2 = 4
|
|
4
|
2^4 = 16
|
|
8
|
2^8 = 256
|
|
16
|
2^16 = 65,536
|
|
24
|
2^24 = 16, 777, 216
|
Graphics File Formats
استاندارد های متفاوتی برای ذخیر نقشه بیتی
درون فایل وجود دارد .GDI+ ازفرمت
های مختلف فایل های گرافیکی
پشتیبانی می کند در زیر آمده اند:
Bitmap (BMP)
·
BMP یک فرمت استاندارد است که در ویندوز
استفاده می شود برای ذخیره تصاویر وابسته به دستگاه یا مستقل از آن تعداد
بیت هایی که برای ذخیره هر پیکسل استفاده می شود در هدر فایل مشخص می شود
.فایل BMP با 24 بیت برای هر پیکسل معمول است.
Graphics Interchange Format (GIF) ·
این فرمت معمولا برای نمایش تصاویر در صفحات وب
به کار می رود .این فرمتی فشرده است اما اطلاعاتش در فرایند فشرده سازی از
دست نمی رود و تصویری که از حالت فشردگی خارج شود همانند تصویر اولیه است
یک رنگ در فایل gif می تواند در حالت شفاف قرار گیرد .همچنین می توان چندین
تصویر را در یک فایل واحد به این شکل ذخیره نمود که مقاصد انیمیشنی دارد .
gif بیش از 8 بیت را برای ذخیره اطلاعات استفاده می کند ولی به 256 رنگ
محدود می باشد.
Joint Photographic Experts Group (JPEG)
·
این فرمتی فشرده است که بیشتر برای ذخیره
تصلویر مناظر استفاده می شود . در فرایند فشرده سازی برخی اطلاعات از بین
می رود اما این تغییرات اندک توسط چشم انسان دیده نمی شود این فرمت برای
ذخیره هرپیکسل 24 بیت استفاده می کند که بیش از 16 میلیون رنگ با آن می
تواند نمایش داده شود .سطوح فشرده سازی برای این فرمت قابل تنظیم است.
.jpg)
در زیر مقابسه حجمی فایل را می بینیم.
.jpg)
Exchangeable Image File (Exif)
·
این فرمت در عکس برداری های دیجیتال استفاده می
شود این فرمت شامل تصویری است که به سبک JPEG فشرده شده است و همچنین
اطلاعات اضافی دیگر(تاریخ گگرفتن عکس ،سرعت شاتر،زمان برداشت عکس و مانند
این ها )و همچنین اطلاعاتی در
مورد دوربین عکاسی (مانند مدل ،کارخانه سازنده و ...).
Portable Network Graphics (PNG)
·
فرمت PNG همانند فرمت GIF می تواند بدون از دست
رفتن اطلاعات عکس آن را فشرده سازد این فرمت مزایای زیادی نسبت به GIF دارد
و در تبادل اطلاعات شبکه ای مورد استفاده قرار می گیرد برخی از مزایای آن :
این فرمت می تواند به ازاء هر پیکسل مقدار آلفا ی آن را ذخیره نماید تعداد
بیت های که برای ذخیره یک پیکسل استفاده می شود می تواند 8،24،48 یبت باشد
و در مد سیاه و سفید 1 ،2،4،8، و یا 16 بیت برای هر پیکسل می باشد .همچنین
می توان درجه مخلوطی هر پیکسل را نسبت به رنگ پس زمینه در این فرمت ذخیره
نمود همچنین این فرمت می تواند اطلاعات
تصحیح گاما و تصحیح رنگ
را ذخیره نماید و همین امر باعث می شود که این فرمت روی دستگاه های
متفاوت به یک شکل دیده شود.
Tag Image File Format (TIFF)
·
TIFF فرمتی است که منعطف و قایل توسعه است و
توسط نوع های متفاوتی از پلاتقرم ها و نرم افزار های پردازش تصویر پشتیبانی
می شود .از مزایای آن می توان به اختیاری بودن تعداد بیت ها برای ذخیره هر
پیکسل ،استفاده از الگوریتم های متفاوت در فشرده سازی و ذخیره چندین تصویر
در یک فایل و ایجاد فایل چند صفحه ای با آن و ذخیره اطلاعات کاملی در مورد
تصویر مثل نوع فشرده سازی و تعداد بیت و کامپیوتر میزبان و ... را اشاره
نمود در صورت نیاز می توان این فرمت را با افزودن تگ هایی توسعه داد.
·
Metafiles
همان طور که قبلا گفته شد متا فایل فایلی است
که می تواند خروجی گرافیکی را روی آن ذخیره نمود و به موقع محتوای آن را
روی یک دستگاه فیزیکی قرار داد +GDI می تواند متا فایل را در فرمت های زیر
ذخیره نمایید.
Windows Metafile Format (WMF)
·
Enhanced Metafile (EMF) ·
EMF+ ·
در مثال زیر طریقه استفاده از یک متافایل آمده
است.
// Create temporary Graphics object for metafile
//
creation and get handle to its device context.
Graphics newGraphics =
this.CreateGraphics();
IntPtr hdc =
newGraphics.GetHdc();
// Create metafile
object to record.
Metafile metaFile1 =
new
Metafile("SampMeta.emf",
hdc);
// Create graphics
object to record metaFile.
Graphics metaGraphics
= Graphics.FromImage(metaFile1);
// Draw rectangle in
metaFile.
metaGraphics.DrawRectangle(new
Pen(Color.Black, 5), 0, 0, 100, 100);
metaGraphics.Dispose();
// Dispose of
metafile.
metaFile1.Dispose();
// Release handle to
temporary device context.
newGraphics.ReleaseHdc(hdc);
// Dispose of
scratch graphics object.
newGraphics.Dispose();
// Create existing
metafile object to draw.
Metafile metaFile2 =
new
Metafile("SampMeta.emf");
// Draw metaFile to
screen.
e.Graphics.DrawImage(metaFile2,
new
Point(0, 0));
// Dispose of
metafile.
metaFile2.Dispose();
کد بالا ابتدا یک متا فایل را ایجاد و در آن یک
مستطیل را رسم نمود و آن را می بندد و سپس شی گرافیکی دیگری ایجاد که
متافایل را رسم می نماید(ابتدا متافایل ایجاد شده قبلی باز می شود.
Drawing, Positioning, and Cloning Images
در +GDI با استفاده از کلاس Image تصاویر را می
توان لود کرد و برای ترسیم یک
تصویر می توان از متد DrawImage
استفاده نمود که پارامتر اصلی آن یک شی از کلاس Image است و پارامتر
های دیگر آن موقعیت درج تصویر می باشد .این تصاویر می تواند از فرمت های
ذکر شده قبلی که توسط +GDI پشتیبانی می شوند باشد.
Image myBMP=new Image.FromFile("Metafile1.emf");
Image myGIF=new Image.FromFile("Soda.gif");
Image myJPEG=new Image.FromFile ("Mango.jpg");
Image myPNG=new Image.FromFile ("Flowers.png");
Image myTIFF=new Image.FromFile ("MS.tif");
myGraphics.DrawImage(myBMP, 10, 10);
myGraphics.DrawImage(myEMF, 220, 10);
myGraphics.DrawImage(myGIF, 320, 10);
myGraphics.DrawImage(myJPEG, 380, 10);
myGraphics.DrawImage(myPNG, 150, 200);
myGraphics.DrawImage(myTIFF, 300, 200);
با استفاده از متد Clone می توان از یک عکس
موجود کپی تهیه نمود.
ابزار ها و امکانات GDI+ در برنامه نویسی می
تواند کاربرد های متعددی داشته باشد نه تنها در بحث ایجاد نرم افزار های
گرافیکی بلکه در طراحی UI (رابط کاربری)
و موارد دیگر می تواند کاربردهای متعددی داشته باشد در آینده سعی
خواهم کرد نمونه هایی از کاربردهای آن در قالب مقالات دیگر را برای دوستان
عزیز آماده نمایی به عنوان نمونه مراجعه شود به
طراحی فرم و کنترل های غیر مستطیلی شکل
پايان.