PDA

View Full Version : رنگ کردن یک Shape در PaintBox



nightHunter
پنج شنبه 01 اسفند 1387, 18:55 عصر
سلام

با استفاده از PaintBox اشکالی رو رسم میکنم ، مثلا یک مستطیل و یا هر شکل دیگه ای ، حالا میخوام درون این شکل را رنگ کنم . قبلا از Pixels استفاده کردم . برای مثال :


Pixels[x,y]:=clred;

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

متشکرم .

Felony
جمعه 02 اسفند 1387, 07:03 صبح
تو Canvas شئ paintBox یه متد به نام Brush هست که رنگ قلمو رو برای رنگ آمیزی معلوم میکنه ، قبل از ترسیم شکلت به اون مقدار بده .


PaintBox1.Canvas.Brush.Color:=ClRed;
PaintBox1.Canvas.Rectangle(10,10,50,50);

nightHunter
چهارشنبه 07 اسفند 1387, 11:49 صبح
متشکرم .

حالا اگر این شکل یک شکل خاص نباشه و متشکل از چند خط باشه چطوری میتونم وسطش رو رنگ آمیزی کنم ؟

mbshareat
چهارشنبه 07 اسفند 1387, 20:44 عصر
آقا چرا از متد FloodFill استفاده نمی کنین که Tcanvas رو با رنگ TBrush رنگ میکنه ؟:متفکر:
میتونین خطوط محیطی شکل رو ترسیم کنین و این متد رو در نقطه ای وسط شکل بسته اجرا کنین.مثال:
Canvas.Pen.Color:=clGreen;
Canvas.MoveTo(100,100);
Canvas.lineto (200,100);
Canvas.PolyBezierTo([Point(175,150),Point(125,150),Point(100,100)]);
Canvas.Brush.Color:=clRed;
Canvas.Brush.Style:=bsSolid;
Canvas.FloodFill(150,125,clGreen,fsBorder);
Canvas.FloodFill(150,125,Canvas.Pixels[150,125],fsSurface);

اولین FloodFill رو زمانی استفاده کنین که خط بسته تماما تگ رنگ داشته باشین و دومی رو وقتیکه محیط داخل خط بسته تماما یک رنگ باشه.البته قلمو می تونه طرح هم داشته باشه مثل pattern های فتوشاپ!:بوس:
در مورد ترسیم سریعتر در Tcanvas هم باید بگم بهتره داخل TBitmap که عملا Tcanvas درون
آن ترسیم میکنه به روش مستقیم ترسیم کنین.
ابتدا این تعریفات رو داشته باشین:
const
MaxPixelCount = 32768;

type
pRGBArray = ^TRGBArray;
TRGBArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
بعد این روال رو تعریف کنین:
Procedure TForm1.SetPixel(X,Y:Integer;C:TColor;B:TBitmap);
Var
DestRow: pRGBArray;
Begin
If (X>-1) And (X<B.Width) And (Y>-1) And (Y<B.Height) then
Begin
DestRow:=B.scanline[Y];
DestRow[X].rgbtRed:=C and 255;
DestRow[X].rgbtGreen:=(C shl 8)Shr 16 ;
DestRow[X].rgbtBlue:=C Shr 16;
End;
End;

توضیح اینکه ScanLine اشاره گری به مکان اولین نقطه خط است.البته حواستون باشه که فایلهای Bmp از پایین به بالا ترسیم می شوند!:گیج:
و بعد عمق بیت رو روی 24 بیت تنظیم کنین.با دستوری مانند:
Image1.Picture.Bitmap.PixelFormat:=pf4bit;

بعد هم
در یکجایی مشابه این کد رو به کار ببرین:

SetPixel(X,Y,clLime,image1.Picture.Bitmap);

و در نهایت تصویر رو نوسازی کنین::لبخند:
image1.Repaint;
برنامه هایی هم که افکتهایی مانند سایه خاکستری و Contrast و Blur و غیره روی تصویر اعمال می کنند به روش مستقیم با TCanvas کار می کنند.:تشویق:
موفق و موید باشید.ما رو هم از دعای خیرتون فراموش نکنین.

nightHunter
چهارشنبه 07 اسفند 1387, 21:33 عصر
متشکرم . ( برات دعا هم کردم ، البته اگر دعای ما گناهکاران مورد قبول حق تعالی باشه )

سوال دیگه ای دارم :
فرض کنید خطی رو بین 2 نقطه برقرار میکنیم ، نقطه A به مختصات x,y و نقطه B به مختصات x1,y1 ، حالا میخواهیم خطی رو به همون طول ولی با یک زاویه خاص مثلا 30 درجه نسبت به اون خط رسم کنیم . چطور میتونم اینکار رو انجام بدم ؟

متشکرم .

Felony
چهارشنبه 07 اسفند 1387, 23:14 عصر
فرض کنید خطی رو بین 2 نقطه برقرار میکنیم ، نقطه A به مختصات x,y و نقطه B به مختصات x1,y1 ، حالا میخواهیم خطی رو به همون طول ولی با یک زاویه خاص مثلا 30 درجه نسبت به اون خط رسم کنیم . چطور میتونم اینکار رو انجام بدم ؟


این نکته به کدنویسی مربوط نیست و باید با فرمول ریاضی این کار رو انجام بدید ، سورس های ساعت عقربه ای که توی سایت هست بهتون کمک میکنه .

mbshareat
پنج شنبه 08 اسفند 1387, 10:55 صبح
دوستمون درست می گه .باید از ()Sin و ()Cos برای این کار استفاده کنین ولی نکته ریزی که لازمه بدونین اینه که نقطه آخر خط ترسیم نخواهد شد!!!:گیج: