PDA

View Full Version : رنگ آمیزی coloration of a paint : paint



bahar_engineer
سه شنبه 27 اسفند 1387, 11:08 صبح
سلام به همگی

می خواستم بدونم شما برای رنگ آمیزی یک paint که به صورت دستی کشیده شده راه حلی سراغ دارین یا لینکی که معرفی کنین

در واقع می خوام تشخیص بده که ناحیه ای رو که کاملاً بوسیله خط بسته شده است، رو با رنگی که کاربر انتخاب می کنه fill رنگ کنه...

خودم دارم سرچ می کنم شما هم اگه زحمتی نیست لینکی دارین معرفی کنین...

ممنونم

bahar_engineer
شنبه 15 فروردین 1388, 09:15 صبح
سلام
سال نوی همه مبارک

کسی نبود که جواب این سوال و بدونه ؟
یه راهنمایی ؟ لینکی ؟

ممنون

SMRAH1
شنبه 15 فروردین 1388, 23:19 عصر
سلام
باید یک تابع بازگشتی بنویسی که بعد از کلیک کردن کاربر،مشخصات پیکسل مورد نظر رو گرفته و بعد به صورت بازگشت تمام نقاط چهار طرف اون رو (بالا پاییم چپ و راست) را فراخوانی می کنه.هر فراخوان دو کار می کند:
1) آیا نقطه فراخوان شده دارای فرمت پیکسل مورد نظر است یا نه .
2) اگر هست ،به فهرست پیکسل های انتخاب شده اضافه کند و دوباهر چهار طرف اون رو فرخوانی کنه.

توی کد Paint.NET می تونی یک نمونه پیدا کنی.در ضمن چند ماه پیش هم یک Map hilighter توی جواب یک تاپیک گذاشتم که این کار رو می کرد.با این حال یک تابع اون رو می گذارم که در واقع قسمت اصلی است (البته این تابع کار های دیگه ای هم علاوه بر جدا کردن ناحیه بسته،انجام میده!):

private void CreateNewBmpHelper2(int x, int y)
{
Color cn = Color.FromArgb(0, 255, 0);
Color CurColor;
Bitmap bmpHelper = null;
Keys keyState = Control.ModifierKeys;
int tolerance = (int)numTolerance.Value * 256 / 100;
CurColor = bmpMian.GetPixel(x, y);

if ((keyState & Keys.Control) == 0 || bmpSelect==null)
{
bmpHelper = new Bitmap(imgMain);
using (Graphics g = Graphics.FromImage(bmpHelper))
{
g.Clear(Color.FromArgb(0, 0, 0, 0));
}

Minx = Maxx = x;
Miny = Maxy = y;
}
else
{
bmpHelper = new Bitmap(bmpSelect);

Minx++;
Maxx--;
Miny++;
Maxy--;
}

Stack st = new Stack();
XYK q = null;

int CountStack = 0;

bmpHelper.SetPixel(x, y, cn);
q = new XYK(x, y, 0);
st.Push(q);

int k;
while (st.Count > 0)
{
CountStack = Math.Max(CountStack, st.Count);

q = (XYK)st.Pop();

for (k = 0; k < 4; k++)
{
switch (k)
{
case 0:
x = q.i - 1;
y = q.j;
break;
case 1:
x = q.i + 1;
y = q.j;
break;
case 2:
x = q.i;
y = q.j - 1;
break;
default:
x = q.i;
y = q.j + 1;
break;
}

if (CheckColor(bmpMian.GetPixel(x, y), CurColor, tolerance) && bmpHelper.GetPixel(x, y) != cn)
{
bmpHelper.SetPixel(x, y, cn);
st.Push(new XYK(x, y, 0));

Minx = Math.Min(Minx, x);
Miny = Math.Min(Miny, y);
Maxx = Math.Max(Maxx, x);
Maxy = Math.Max(Maxy, y);
}
}
}

Minx--;
Maxx++;
Miny--;
Maxy++;
strMsg = String.Format("Max Stack Count = {0} \t {1} < x < {2} \t {3} < y < {4}",
CountStack, Minx, Maxx, Miny, Maxy);

bmpSelect = bmpHelper;

//GC.WaitForPendingFinalizers();
}


این تابع یک ناحیه بسته با رنگ

Color.FromArgb(0, 255, 0)
رو که شامل نقطه x,y است را (با در نظر گرفت یک تلرانس) جدا می کنه.

موفق باشید