PDA

View Full Version : دسترسی به پیکسل های یک عکس



hamed_f65
شنبه 27 تیر 1388, 12:10 عصر
سلام
فرض کنید یک فرم خالی داریم که داخلش یک picturebox قرار داره و یک button

وقتی برنامه اجرا میشه یه عکسی از توی هارد داخل picturebox لود میشه
حالا من میخوام مثلا نقطه ی (100و200) عکس رو مشکی رنگ کنم

مورد اول اینکه :میشه بفرمائید چطوری این کارو انجام بدم؟

مورد دوم اینکه : چطوری میشه بفهمم مثلا نقطه (100و300) عکسم چه رنگی هستش

اگه لطف کنید و کد هر قسمت رو بنویسید ممنون میشم

hozouri
شنبه 27 تیر 1388, 12:28 عصر
OpenFileDialog o = new OpenFileDialog();
if (o.ShowDialog() == DialogResult.OK)
{
Bitmap p = new Bitmap(o.FileName);
p.SetPixel(200, 100, Color.FromArgb(100, 100, 100));
Color color = p.GetPixel(300, 100);
}

hamed_f65
شنبه 27 تیر 1388, 12:37 عصر
OpenFileDialog o = new OpenFileDialog();
if (o.ShowDialog() == DialogResult.OK)
{
Bitmap p = new Bitmap(o.FileName);
p.SetPixel(200, 100, Color.FromArgb(100, 100, 100));
Color color = p.GetPixel(300, 100);
}



حالا چظوری می تونم بفهمم color چه محتویاتی داره ؟
منظورم اینه که چطوری کد رنگش رو استخراج کنم که قابل نمایش باشه

mohkami
شنبه 27 تیر 1388, 12:47 عصر
سلام،
میتونی برای تست از یک panel استفاده کنی و :



private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
panel1.BackColor = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
}

hozouri
شنبه 27 تیر 1388, 13:08 عصر
color.A;
color.B;
color.G;
color.R;

hamed_f65
شنبه 27 تیر 1388, 18:58 عصر
سلام،
میتونی برای تست از یک panel استفاده کنی و :



private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
panel1.BackColor = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
}



میشه یه مقدار توضیح بدید
متوجه نمیشم این کد چیکار میکنه

mohkami
شنبه 27 تیر 1388, 20:00 عصر
سلام،
بله
ببین شما یه Panel به فرمت اضافه میکنی که اسمش میشه panel1

Event زیر برای حرکت Mouse روی Picturebox هست

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

کد زیر عکس(Image) موجود در PictureBox رو به Bitmap تبدیل میکنه و با GetPixel رنگ پیکسلی رو برمیگردونه که Mouse روی اون هست(e.X,e.Y)

((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y)

و در آخر BackColor اون Panel رو همین رنگ قرار میدید.

panel1.BackColor = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);

hamed_f65
شنبه 27 تیر 1388, 20:19 عصر
سلام،
بله
ببین شما یه Panel به فرمت اضافه میکنی که اسمش میشه panel1

Event زیر برای حرکت Mouse روی Picturebox هست

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)کد زیر عکس(Image) موجود در PictureBox رو به Bitmap تبدیل میکنه و با GetPixel رنگ پیکسلی رو برمیگردونه که Mouse روی اون هست(e.X,e.Y)

((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y)و در آخر BackColor اون Panel رو همین رنگ قرار میدید.

panel1.BackColor = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);

فقط قسمت آخرش رو مشکل داشتم دوست عزیز که حل شد
البته یه ارور هم می داد که مربوط میشد به سایز پنل و عکس که می بایستی با هم مساوی باشن

mohkami
شنبه 27 تیر 1388, 20:37 عصر
حامد آقای گل قبل از اینکه عکسی توی PictureBox بذاری اگه Mouse رو ببری روش Error میده چون خالیه.
سایز Panel و PictureBox به هم ربطی ندارند.عکس زیر رو نگاه کن متوجه میشی:

33492

:لبخندساده:

hamed_f65
یک شنبه 28 تیر 1388, 14:00 عصر
ممنون
چند تا سوال واسه من پیش اومده که امیدوارم دوستان باز هم لطف کنن و مشکل رو حل کنن :

1 : این color.a چه چیزی رو مشخص میکنه ؟

2 : با توجه به عکس ضمیمه من می خوام وقتی ماوس روی picturebox رفت مقدار R,B,G,A استخراج بشه و توی هر کدوم از textbox های مربوطه قرار بگیره . با چه دستوری این کار رو انجام بدم ؟

3 : اگر بخوام برنامه طوری طراحی بشه که بتونه رنگ های مشکی و نزدیک به مشکی یا سفید و نزدیک به سفید رو تشخیص بده باید چکار کنم . منظورم اینه که فرض کنید می خوام وقتی ماوس روی یه رنگ مشکی یا خیلی نزدیک به مشکی رفت مثلا تایمر من شروع به کار کنه . با چه دستوری باید این کار رو انجام داد ؟

4 : در آخر اگر اطلاعاتی در رابطه با ترکیب 3 تا رنگ یا مقادیر R,G,B دارید بفرمائید

ممنون از همه دوستان

mohkami
یک شنبه 28 تیر 1388, 14:44 عصر
سلام مجدد،
A مقدار Transparency رو نشون میده که اندازش بین 0 و 255 هست،
Transparent برار با 0
کامل 255


بقیه سوالاتت رو روی کد توضیح دادم:



private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
int a,b,r,g;

//A rang ro migire va tuye a gharar mide
//stringesh ro mizarim tuye text boxe A
a=((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y).A;
txtA.Text = a.ToString();

b=((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y).B;
txtB.Text = b.ToString();

r=((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y).R;
txtR.Text = r.ToString();

g=((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y).G;
txtG.Text = g.ToString();

//be nazaram baraye inke chek koni rangesh
//nazdik be meshki hast in 3 halat ro bayad check koni
//va man goftam age nazdik be meshki bud un pixel ro sefid kone
if (b < 100 && r < 100 && g < 100)
{
Bitmap p = (Bitmap)pictureBox1.Image;
p.SetPixel(e.X, e.Y, Color.White);
pictureBox1.Image = (Image)p;
}
}



در مورد سوال آخرتون هم باید بگم روی عکس mouse رو ببر و مقدار RGB ببین چطور تغییر میکنه تا ببینی ترکیبش چجوری میشه.

33542

hamed_f65
سه شنبه 30 تیر 1388, 10:04 صبح
حامد آقای گل قبل از اینکه عکسی توی PictureBox بذاری اگه Mouse رو ببری روش Error میده چون خالیه.
سایز Panel و PictureBox به هم ربطی ندارند.عکس زیر رو نگاه کن متوجه میشی:

33492

:لبخندساده:

دقیقا منظور بنده هم همین بود منتها بد بیان کردم
چون تصویری که توی picturebox قرار دادم کاملا فیت نشده بود ارور میداد
ممنون