ورود

View Full Version : تبدیل RGB به HSV



joooje
شنبه 09 مهر 1390, 09:21 صبح
سلام به همه
من میخوام که یه ترکیب سه تایی RGB رو به HSV تبدیل کنم
تو انجمن گشتم ولی حتی یه مورد مرتبط هم پیدا نکردم
از یه سایت دیگه این کد رو پیدا کردم
ولی نحوه استفاده از اون رو نمیدونم


type
THSV = record // hue saturation value (HSV)
Hue , Sat , Val : Double;
end;
{....}

function RGB2HSV (R,G,B : Byte) : THSV;
var
Min_, Max_, Delta : Double;
H , S , V : Double ;
begin
H := 0.0 ;
Min_ := Min (Min( R,G ), B);
Max_ := Max (Max( R,G ), B);
Delta := ( Max_ - Min_ );
V := Max_ ;
If ( Max_ <> 0.0 ) then
S := 255.0 * Delta / Max_
else
S := 0.0 ;
If (S <> 0.0) then
begin
If R = Max_ then
H := (G - B) / Delta
else
If G = Max_ then
H := 2.0 + (B - R) / Delta
else
If B = Max_ then
H := 4.0 + (R - G) / Delta
End
else
H := -1.0 ;
H := H * 60 ;
If H < 0.0 then H := H + 360.0;
with Result Do
begin
Hue := H ; // Hue -> 0..360
Sat := S * 100 / 255; // Saturation -> 0..100 %
Val := V * 100 / 255; // Value - > 0..100 %
end;
end;

یعنی نمیدونم الان چه طور میتونم سه تا عدد به عنوان RGB بدم و مقدار Hue ,Sat , VAl رو برای اون رنگ مورد نظرم به دست بیارم
ممنون میشم راهنمایی نمایید

سعید صابری
شنبه 09 مهر 1390, 15:21 عصر
به این شکل


var
X:THSV;
begin
X:=RGB2HSV(100,200,250);

این هم مقدار برای استفاده
x.Val
x.Sat
X.Hue

joooje
شنبه 09 مهر 1390, 17:11 عصر
ممنون
ولی این که به x.Val یا x.Sat و X.Hue گیر میده
من همون کدی که تو پست اول نوشتم رو وارد کردم و مشکلی نیست
ولی بعد کد شما رو به یه دکمه دادم که گیر میده
ممنون میشم راهنمایی کنید!

سعید صابری
شنبه 09 مهر 1390, 19:10 عصر
چه گیری میده؟

joooje
شنبه 09 مهر 1390, 20:46 عصر
خب کامپایل نمیکنه دیگه !
چشمک زن رو میاره قبل از x.Val و ...
تو uses نیازی نیست چیزی اضافه کنم؟

SAASTN
شنبه 09 مهر 1390, 22:03 عصر
سیستم رنگی HSV(Hue, Saturation, Value) با نامهای دیگه ای مثل HSB(Hue, Saturation, Brightness) یا HLS(Hue, Luminance, Saturation) هم شناخته میشه. اگه بجای Saturation با Chroma هم برخورد کردید تعجب نکنید.

برای این تبدیل می تونید از تابع ColorRGBToHLS که توی GraphUtil پیاده شده هم استفاده کنید. ColorHLSToRGB هم عکس همین کار رو انجام میده.

توجه داشته باشید که در این توابع R, G, B در بازه 0-255 و H, L, S در بازه 0-240 متغیرند، و پارامتر clrRGB و خروجی ColorHLSToRGB هم که از نوع TColorRef تعریف شدن در واقع همون TColor خودمونن. با توابع GetRValue, GetGValue و GetBValue که در یونیت Windows تعریف شدن میشه مقادیر قرمز، سبز و آبی رو از TColor استخراج کرد و با تابع RGB که باز هم در Windows پیاده شده میشه یه TColor از روی مقادیر اولیه تولید کرد.

-----------------------
بعد از در و گوهر پاشی(یا پاچی) در سطور فوق یه سری به ویکی (http://en.wikipedia.org/wiki/HSL_and_HSV) زدم و متوجه شدم که HSV دقیقا همون HLS نیست.
HSV خیلی شبیه به نیمه پائینی HLS هست، یعنی مثلا در همون توابع بالا، L بجای 0 تا 240، از 0 تا 120 متغیره. البته همون عکس توی ویکی نشون میده که این فرض صحیح نیست. اینه که بر گردیم سر کد خودتون:

شما احتمالا کد minair2004 رو بدون هیچ تحریفی کپی کردین تو دلفی و کامپایل کردید، خوب X.Val به تنهایی یک دستور نیست و کامپایلر بهش گیر میده. به جای سه خط آخر کد زیر رو امتحان کنید که بدون مشکل اجرا میشه:
Caption := Format('H:%f, S:%f, V:%f', [X.Hue, X.Sat, X.Val]);

joooje
یک شنبه 10 مهر 1390, 00:05 صبح
ممنون از راهنماییتون و مشکلم حل شد.
فقط من اصلاح بکنم در مورد مقادیر ممکن برای سه متفییر HSV :

h (Hue) will be from 0 to 359 (corresponding to 0..359 degrees around hexcone.(
s (Saturation) will be from 0 (shade of gray) to 99 (pure color.(
v (Value) will be from 0 (black) to 99 {white.(