View Full Version : به دست آوردن مقادیر RGB
Beginner2013
جمعه 16 تیر 1391, 11:48 صبح
من یک رنگ از نوع Integer دارم.چجوری میتونم مقادیر R,G,B رو بدست بیارم؟
تشکر
Felony
جمعه 16 تیر 1391, 11:55 صبح
GetRValue(Color);
GetGValue(Color);
GetBValue(Color);
Ananas
جمعه 16 تیر 1391, 21:06 عصر
به شکل دستی هم میشه :
var
c, a, r, g, b : TColor;
begin
c := Form1.Color;
r := c and $000000ff;
g := (c and $0000ff00) shr 8;
b := (c and $00ff0000) shr 16;
a := (c and $ff000000) shr 24;
end;
برای ترکیب هم :
c := r or (g shl 8) or (b shl 16) or (a shl 24);
Beginner2013
شنبه 17 تیر 1391, 15:05 عصر
var
c, a, r, g, b : TColor;
begin
c := Form1.Color;
r := c and $000000ff;
g := (c and $0000ff00) shr 8;
b := (c and $00ff0000) shr 16;
a := (c and $ff000000) shr 24;
end
به شکل دستی هم میشه :
برای ترکیب هم :
c := r or (g shl 8) or (b shl 16) or (a shl 24);
من کدی رو که نوشتید متوجه نشدم،میشه کمی توضیح بدید.
باتشکر
Ananas
شنبه 17 تیر 1391, 17:17 عصر
نوع TColor از جنس Cardinal هست بخاطر همین به شکل یک عدد صحیح بدون علامت 32 بیتی میشه باهاش کار کرد. 8 بیت اول از سمت راست مربوط به رنگ قرمز و 8 بیت دوم مربوط به سبز و 8 بیت سوم برای آبی و 8 بیت 4 برای مقدار آلفا در نظر گرفته میشه. برای اینکه مثلا ما رنگ سبز رو به شکل یک بایت داشته باشیم باید با استفاده از and بیتی بقیه ی بیت ها رو غیر فعال کنیم (یک جور فیلتر برای بایت دوم که مربوط به رنگ سبز هست 0x0000ff00) بعد برای اینکه این عدد بدست اومده رو بیاریم بین 0 تا 255 باید از شیفت به سمت راست استفاده کنیم و چون بایت دوم هست باید 8 واحد به سمت راست شیفت بدیم. برای بقیه هم به همین ترتیب.
حالا برای ترکیب اجزا و بدست آوردن رنگ اصلی باید مقادیر رنگی بین 0 تا 255 مون رو ببریم به مکان اصلی خودش با استفاده از شیفت به سمت چپ (برای قرمز 0 و برای سبز 8 و برای آبی 16 و برای آلفا 24 واحد شیفت به چپ). بعد این 4 تا رنگ رو با استفاده از or کنار هم قرار می دیم. یعنی هر رنگ بیت های مربوط به خودش رو تکمیل میکنه.
در مورد ff هم که باید بدونید وقتی عدد رو به شکل هگزادسیمال می نویسیم معادل هست با 255 و رنگ های قرمز و سبز و آبی و مقدار آلفا هر کدوم 256 حالت رو می پذیرند. البته ممکنه تو بعضی جاها (مثل Direct3D) ترتیب قرار گیری رنگ ها متفاوت باشه و یا حتی برای هر رنگ 255 حالت نباشه و حتما همه جا مثل حالت رنگ 32 بیتی GDI ویندوز نباشه مثلا یکی از حالت های رنگ Direct3D مثل حالت 32 بیتی GDI هست فقط جای قرمز با آبی عوض میشه. نمی دونم دیگه کجاها ممکنه اینطور باشه ولی اگه اشتباه نکنم کلا تو GDI برای رنگ 32 بیتی به همین شکله که کدش رو نوشتم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.