چهارشنبه ۶ بهمن ۱۳۹۵
 
 
 
کلمه عبور خود را فراموش کرده اید؟
 

 
 
  مروری بر +GDI (قسمت سوم)
.NET Graphics
تاریخ ثبت:  ۸۷/۹/۱
تعداد نمایش:  ۳۸۸۳
  نویسنده: سعید هوشمند
 
   ۶  نفر تا این لحظه به این مقاله امتیاز داده اند.
 
   Bookmark and Share

در قسمت اول مفاهیم 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);

و یا حتی قسمتی از مسیرتان یک رشته باشد به شکل زیر

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);

و خروجی آن به شکل زیر در خواهد آمد:

Brushes and Filled Shapes

یک مستطیل یا یک بیضی شامل خطوط بیرونی (مرزی) درون می باشد .خطوط مرزی آن با Pen و درون آن با شی Brush پر می شود .+GDI چندید کلاس Brush  برای پر کردن درون اشکال بسته دارد : SolidBrush و HatchBrush و TextureBrush و LinearGradientBrush و PathGradientBrush همه کلاس هایی از این قبیل هستند که از کلاس Brush ارث می برند.

·        Solid Brushes

با استفاده از این براش می توان داخل یک شکل بسته را با یک رنگ پر نمود

SolidBrush mySolidBrush(Color.Blue);

myGraphics.FillEllipse(mySolidBrush, 0, 0, 60, 40);

·        Hatch Brushes

با استفاده از این براش می توان یک رنگ رو زمینه و رنگی برای پس زمینه و همچنین سبک هاشور را برای پر کردن داخل شکلی بسته مشخص نمود.

·        Texture Brushes

با استفاده از این براش می توان درون شکلی بسته را با استفاده از الگوی ذخیره شده در فایلی نقشه بیتی  پر نمود.

·        Gradient Brushes که قبلاً توضیح داده شده است

Open and Closed Curves

در شکل زیر یکی از منحنی ها بسته و دیگری باز می باشد.

منحنی بسته دارای ناحیه درونی است و می تواند با یک براش پر شود.متد های زیربرای پر کردن منحنی های بسته به کار می رود . 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);

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 ناحیه مشخص شده که یکی از مستطیل و دیگری از یک مسیر گرافیکی حاصل شده است.

ناحیه معمولا برای چیدن (clipping) و یا آزمایش برخورد (hit testing) .clipping  محدود کردن ترسیم را به محدوده خاصی از صفحه نمایش می گویند که معمولا قسمتی از صفحه نمایش است که نیاز به بهنگام سازی دارد .hit testing  به عمل چک کردنی می گویند که آیا ماوس در هنگام فشردن شدن دکمه اش روی ناحیه قرار دارد یا نه.

می توان ناحیه ها را به هم تقسیم یا با هم اجتماع xor  یا از هم کم کرد و می توان مکمل گرفت.

در شکل زیر دو حاثل دو عملی که بر روی 2 ناحیه بالا انجام شده را می بینیم

و در اشکال زیر نیز حاصل 2 نمونه دیگر مشخص شده است

با استفاده از متد FillRegion  می توان یک ناحیه را با براشی خاص پر کرد.

myGraphics.FillRegion(mySolidBrush, myRegion);

Clipping

کلیپینگ ترسیم را به ناحیه معین محدود می کند در شکل زیر متن "Hello" را در ناحیه ای  به شکل قلب محدود کرده است.

ناحیه می تواند از یک مسیر ایجاد شود و مسیر می تواند یک متن یاشد در شکل زیر این کار صورت گرفته است.

برای ترسیم یک کلیپ از متد 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);

Antialiasing with Lines and Curves

وقتی که شما با +GDI کار می کنید و یک خط را می خواهید رسم کنید فقط نقطه شروع و پایان را برای آن مشخث می کنید و بر روی پیکسل هایی که در دستگاه مقصد باید روشن شود تا خط رسم شود کنترلی ندارید اگر به صورت دقیقی تنها پیکسل های بین این دو نقطه روشن شود خط حاصله شکلی به صورت زیر خواهد داشت.

با فعل سازی خاصیت Antialiased در ترسیم خط می توان  خطی ایجاد نمود که صاف بنظر براشد و دارای زبانه های تیز نباشد.

در نگاهی دورتر این خط کاملا صاف ینظر خواهد رسید . همین عمل را می توان بر روی منحنی و اشکال دیگر انجام داد.

 

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 میلیون رنگ با آن می تواند نمایش داده شود .سطوح فشرده سازی برای این فرمت قابل تنظیم است.

در زیر مقابسه حجمی فایل را می بینیم.

        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 (رابط کاربری)  و موارد دیگر می تواند کاربردهای متعددی داشته باشد در آینده سعی خواهم کرد نمونه هایی از کاربردهای آن در قالب مقالات دیگر را برای دوستان عزیز آماده نمایی به عنوان نمونه مراجعه شود به

طراحی فرم و کنترل های غیر مستطیلی شکل

پايان.

  کیفیت مقاله ارائه شده از نظر شما   
برای دادن رتبه به این مقاله می بایست Login کرده باشید.
  درباره نویسنده
سعید هوشمند
تخصص بنده در برنامه نویسی برنامه کاربردی وبرنامه نیسی شبکه و طراحی و پیاده سازی نرم افرار های جامع می باشد
همه مقاله های نوشته شده توسط این کاربر (۵)
 
  پیام جدید
صفحه ۱ - پیامهای اصلی ۱ تا ۱ از مجموع ۱ پیام اصلی
اولین قبلی بعدی

 عنوان فرستنده تاریخ
 
تشكر الهام رضائي ۱۳۸۹/۷/۱۴
اولین قبلی بعدی

Copyright © 2006 - 2016 All Rights Reserved.
Please direct your questions or comments to