PDA

View Full Version : رنگ پیکسل به صورت RGB



حامی2
دوشنبه 30 آبان 1384, 02:16 صبح
با سلام به دوستان


من می خواهم هرجایی روی فرم که مختصاتش را بدهم رنگ پیکسل به صورت تفکیک شده RGBبه من داده شود از چه دستوری باید استفاده کنم باید بگم که دستور پیکسل یه عدد 8 رقم بر میگرداند

باتشکر

seyedof
دوشنبه 30 آبان 1384, 09:54 صبح
سلام
GetRValue , GetGValue , GetBValue
ممنون علی

حامی2
دوشنبه 30 آبان 1384, 15:50 عصر
با تشکر

اما من در BCB6 دستوری می خواهم

ممنون

حامی2
دوشنبه 30 آبان 1384, 16:14 عصر
این توابعی که گفتید ماکرو هستند آن وقت ورودی این توابع چیست و از چه دستوری باید به انها مقدار بدهم

باتشکر محسن

seyedof
دوشنبه 30 آبان 1384, 17:11 عصر
سلام
فکر نکنم ماکرو باشند. اینها توابع API ویندوز هستند و در تمام محیطهای برنامه نویسی تحت ویندوز هم قابل استفاده اند. نمیدانم آیا در بیلدر تابعی برای اینکار هست یا نه ولی اگر هم هست توصیه میکنم استفاده نکنید چون برنامه شما وابسته به محیط میشه و مثلا اوونوقت توی ویژوال سی کار نخواهد کرد. ضمنا معمولا توابع API سریعتر از توابع مشابه در Wrapper هایی که Builder دارد هستند. از جمله برای خواندن خود رنگ پیکسلها اوون روش آرایه ای که خود بیلدر داره کندتر از GetPixel مال API عمل میکنه.
و یک سوال شخصی : شما احیانا آقای حامی بیدرنگ نیستید؟
ممنون علی

seyedof
دوشنبه 30 آبان 1384, 17:21 عصر
سلام
ببخشید فراموش کردم. باید عدد رنگ رو به این توابع بدید و این توابع در مقدار بازگشتی مقدار کمپوننتهای تشکیل دهنده رنگ یعنی R و G و B رو به شما برمیگردونند. ضمنا در MSDN راهنمای این توابع و همینطور در راهنمای خود بیلدر هم هست.
ممنون علی

حامی2
دوشنبه 30 آبان 1384, 18:02 عصر
با تشکر فراوان

دادن رنگ را میشه به این صورت انجام داد canvas->pixel[][]c یا جور دیگری است

نه من محسن حامی هستم و اصفهانی

seyedof
دوشنبه 30 آبان 1384, 18:51 عصر
سلام
همونطوری که گفتید هم میشه.
ممنون علی

فرهاد.ف
سه شنبه 01 آذر 1384, 08:55 صبح
TColor C1 ;
BYTE R, G, B ;
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
C1 = Canvas->Pixels[X][Y] ;
R = GetRValue((DWORD)C1) ;
G = GetGValue((DWORD)C1) ;
B = GetBValue((DWORD)C1) ;
}

PalizeSoftware
سه شنبه 01 آذر 1384, 09:09 صبح
دوست عزیز گیرم که دستوری هم پیدا نکردی خب خودت مقادیر رو جدا می‌کردی.


r = (lColor And &HFF&)
g = (lColor And &HFF00&) / &H100
b = (lColor And &HFF0000) / &H10000

حامی2
شنبه 05 آذر 1384, 09:55 صبح
ممنون از همه دوستان جواب گرفتم

seyedof
شنبه 05 آذر 1384, 15:58 عصر
دوست عزیز گیرم که دستوری هم پیدا نکردی خب خودت مقادیر رو جدا می‌کردی.


r = (lColor And &HFF&)
g = (lColor And &HFF00&) / &H100
b = (lColor And &HFF0000) / &H10000



سلام
نه نه !‌ اینکار کاملا اشتباهه. این کدی که شما نوشتید کار درستی نیست چون فقط در مود ۲۴ یا ۳۲ بیتی کار میکنه (منظور مود گرافیک است) و در مودهای ۱۶ یا هر عمق بیت دیگری بیت جواب نخواهد داد. روش درستش در API همون استفاده از سه تابع ذکر شده است.
ممنون علی

PalizeSoftware
شنبه 05 آذر 1384, 18:33 عصر
دوست عزیز من نگفتم این کد در همه مدها جواب می‌ده. بلکه اشاره به این دارم که تفکیک مقدار هر رنگ فرمول پیچیده‌ای نیست که کار کسی بخواد بابتش لنگ بمونه. یه عدد چند بیتی است که این روش جداسازی بیت‌ها رو توضیح می‌ده.