PDA

View Full Version : سوال: شرط حدود رنگ؟!



Slytherin
پنج شنبه 02 دی 1389, 13:18 عصر
دوستان امکان نوشتن شرطی وجود داره که مثلا اگه رنگ یک شی خاصی سبز بود (حالا هر سبزی! مغز پسته ای! چمنی! پر رنگ! کم رنگ!) ، اون رو بررسی کنه و سبز تشخصی بده؟
منظورم اینه که کلا اگه شی سبز بود، شرط اجرا بشه و برای شرط هم فرقی نداشته باشه که چه نوع سبزی هست!
البته من نمی خواهم در برنامه تک تک سبز ها رو معرفی کنم و از یک ساختار Select Case باشم!
دیگه نمی دونم منظورم رو چطوری بگم:لبخند:
خواهشا راهنمایی کنید:لبخندساده:

MMR_1344
پنج شنبه 02 دی 1389, 22:32 عصر
فکر کنم اگر بتونی رنگ مورد نظر رو به رنگهای اصلیتبدیل بکنی و بعد کنترل کنی که این سه رنگ اصلی در حاشیه رنگ مورد نظر (از روشن تا تیر) قراردارن بتونی این کار رو انجام بدی

ali.rezaei7
جمعه 03 دی 1389, 00:30 صبح
درود.
دوست عزیز شما در ابتدا باید کم رنگترین و پررنگترین مقدار رنگ خودتونو بدست بیارید و دو مقدار مورد نظرتونو در داخل دو متغیر از نوع Long قرار بدید. سپس در داخل شرط بررسی کنید که آیا رنگ مورد نظر در بازه این دو رنگ بدست آمده قرار دارد یا نه. به عنوان مثال اگر مقدار کمرنگ ترین حالت سبز 366 باشد و پررنگترین حالت آن 963 در این صورت مقدار رنگ مورد نظر باید بین 366 و 963 باشد.
پاینده باشید.

Slytherin
جمعه 03 دی 1389, 08:40 صبح
فکر کنم اگر بتونی رنگ مورد نظر رو به رنگهای اصلیتبدیل بکنی و بعد کنترل کنی که این سه رنگ اصلی در حاشیه رنگ مورد نظر (از روشن تا تیر) قراردارن بتونی این کار رو انجام بدی

چطوری باید این کار رو انجام داد؟

Slytherin
جمعه 03 دی 1389, 08:41 صبح
درود.
دوست عزیز شما در ابتدا باید کم رنگترین و پررنگترین مقدار رنگ خودتونو بدست بیارید و دو مقدار مورد نظرتونو در داخل دو متغیر از نوع Long قرار بدید. سپس در داخل شرط بررسی کنید که آیا رنگ مورد نظر در بازه این دو رنگ بدست آمده قرار دارد یا نه. به عنوان مثال اگر مقدار کمرنگ ترین حالت سبز 366 باشد و پررنگترین حالت آن 963 در این صورت مقدار رنگ مورد نظر باید بین 366 و 963 باشد.
پاینده باشید.

یعنی منظورتون اینه که اول باید رنگ ها از مبنای 16 به مبنای 10 تبدیل شوند و بعد مقایسه شوند؟

Slytherin
جمعه 03 دی 1389, 12:46 عصر
من در مبنای 16 رنگ ها رو بررسی کردم، مثلا چندین نوع رنگ قرمز داریم که هیچ شباهتی بهم ندارند و همشون قرمز هستند،
چطوری باید کاری کرد که بازه اینجور رنگ ها شناسایی شود؟

pcdownload.bloghaa.com
شنبه 04 دی 1389, 02:31 صبح
استفاده کردن از سیستم RGB برای حل این مساله کار آسانی نخواهد بود.(کد hex هم همان سه پارامتر RGB است در مبنای 16)

برای تشخیص محدوده رنگ سبز بهترین سیستم رنگ HSL می باشد.
برنامه paint را باز کنید به منوی color و edit color بروید و از پنجره ای که باز می شود دکمه Defines Custom Colors را بزنید.
مستطیل رنگی که ظاهر می شود به خوبی محدوده رنگ سبز را نشان می دهد.
که hue طول و sat عرض رنگ در مستطیل و lum سایه روشن آن را تعیین می کند.
تعیین محدوده در این سیستم بسیار راحتتر است.پس ابتدا باید کد رنگ خود را از RGB به HSL تبدیل کرده و سپس ان را
در محدوده معین شده چک کنید.

MMR_1344
شنبه 04 دی 1389, 20:17 عصر
دوست خوب pcdownload.bloghaa.com
برای تبدیل Color به RGB از تقسیم رنگ به عدد 256 به صورت زیر میتوان استفاده کرد


R=Color Mod &h100
Color=Color \ &H100
G=Color Mod &H100
Color = Color \ &H100
B= Color Mod &H100

اما برای تیدیل رنگ بهHSL از چه دستوری میشه استفاده کرد

pcdownload.bloghaa.com
سه شنبه 07 دی 1389, 20:44 عصر
برای تبدیل رنگ rgb به hsl چند تا راه هست که به شما می گم:

1:

Private Type HSL
Hue As Long
Saturation As Long
Luminance As Long
End Type
Public Function RGBToHSL01(ByVal RGBValue As Long) As HSL
' by Branco Medeiros, 1999, branco@apis.com.br
' (adapted from Java.awt.Color.java)
' adjusted to our definition by Donald, 20011116
Dim lMin As Long, lMax As Long, lDelta As Long
Dim R As Long, G As Long, B As Long
Dim nTemp As Single

R = RGBValue And &HFF
G = (RGBValue And &HFF00&) \ &H100&
B = (RGBValue And &HFF0000) \ &H10000

lMax = IIf(R > G, IIf(R > B, R, B), IIf(G > B, G, B))
lMin = IIf(R < G, IIf(R < B, R, B), IIf(G < B, G, B))

RGBToHSL01.Luminance = (lMax * 100) / 255

If lMax > 0 Then
lDelta = lMax - lMin
RGBToHSL01.Saturation = (lDelta / lMax) * 100
If lDelta > 0 Then
If lMax = R Then
nTemp = (G - B) / lDelta
ElseIf lMax = G Then
nTemp = 2 + (B - R) / lDelta
Else
nTemp = 4 + (R - G) / lDelta
End If
RGBToHSL01.Hue = nTemp * 60
If RGBToHSL01.Hue < 0 Then
RGBToHSL01.Hue = RGBToHSL01.Hue + 360
End If
End If
End If

End Function


2:


Private Type HSL
Hue As Long
Saturation As Long
Luminance As Long
End Type
Public Function RGBToHSL02(ByVal RGBValue As Long) As HSL
' by Donald (Sterex 1996), donald@xbeat.net, 20011116
Dim R As Long, G As Long, B As Long
Dim lMax As Long, lMin As Long
Dim q As Single

R = RGBValue And &HFF
G = (RGBValue And &HFF00&) \ &H100&
B = (RGBValue And &HFF0000) \ &H10000

If R > G Then
lMax = R: lMin = G
Else
lMax = G: lMin = R
End If
If B > lMax Then
lMax = B
ElseIf B < lMin Then
lMin = B
End If

RGBToHSL02.Luminance = lMax * 100 / 255

If lMax > lMin Then
RGBToHSL02.Saturation = (lMax - lMin) * 100 / lMax
q = 60 / (lMax - lMin)
Select Case lMax
Case R
If B > G Then
RGBToHSL02.Hue = q * (G - B) + 360
Else
RGBToHSL02.Hue = q * (G - B)
End If
Case G
RGBToHSL02.Hue = q * (B - R) + 120
Case B
RGBToHSL02.Hue = q * (R - G) + 240
End Select
End If

End Function


3:


Private Type HSL
Hue As Long
Saturation As Long
Luminance As Long
End Type
Public Function RGBToHSL03(ByVal RGBValue As Long) As HSL
' by Paul - wpsjr1@syix.com, 20011120
Dim R As Long, G As Long, B As Long
Dim lMax As Long, lMin As Long
Dim q As Single
Dim lDifference As Long
Static Lum(255) As Long
Static QTab(255) As Single
Static init As Long

If init = 0 Then
For init = 2 To 255 ' 0 and 1 are both 0
Lum(init) = init * 100 / 255
Next
For init = 1 To 255
QTab(init) = 60 / init
Next init
End If

R = RGBValue And &HFF
G = (RGBValue And &HFF00&) \ &H100&
B = (RGBValue And &HFF0000) \ &H10000

If R > G Then
lMax = R: lMin = G
Else
lMax = G: lMin = R
End If
If B > lMax Then
lMax = B
ElseIf B < lMin Then
lMin = B
End If

RGBToHSL03.Luminance = Lum(lMax)

lDifference = lMax - lMin
If lDifference Then
' do a 65K 2D lookup table here for more speed if needed
RGBToHSL03.Saturation = (lDifference) * 100 / lMax
q = QTab(lDifference)
Select Case lMax
Case R
If B > G Then
RGBToHSL03.Hue = q * (G - B) + 360
Else
RGBToHSL03.Hue = q * (G - B)
End If
Case G
RGBToHSL03.Hue = q * (B - R) + 120
Case B
RGBToHSL03.Hue = q * (R - G) + 240
End Select
End If
End Function


ورودی همه این توابع rgb به صورت hex است مثل &HE61C94

---------------------------------------------------
موفق باشید.