kleuren detecteren in vb 2005

Status
Niet open voor verdere reacties.

Y Zone

Nieuwe gebruiker
Lid geworden
10 mrt 2007
Berichten
3
Beste forumleden, ik ben aan een project bezig om kleuren te detecteren via de muiscursor die over een kleur gaat.
Ik ben echter al redelijk ver, toch worden de meeste kleuren niet goed gedetecteerd.
Bv. : wit wordt als paars beschouwd en dergelijke.
Ik ben nog niet erg vertrouwd met visual studio dus graag wil ik van jullie weten wat verkeerd is of wat beter moet.
Het bestand vindt u in bijlage, graag had ik nog enkele basiskleuren als oranje en bruin erbij gewild.

Vriendelijk groeten
 

Bijlagen

Beste

http://bittorrent.maxcim.nl/uitpakken.php, op die site krijg je een beetje een idee van hoe je het bestand moet openen.

Hieronder zet ik de code voor diegene die het bastand niet willen downloaden.

Public Class frmKleurendetector
Public Structure POINT
Dim x As Int32
Dim y As Int32
End Structure
Public Declare Function M_GetCursorPos Lib "user32" Alias "GetCursorPos" (ByRef lpPoint As Point) As Int32
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Int32) As Int32
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Int32, ByVal hWndInsertAfter As Int32, ByVal x As Int32, ByVal y As Int32, ByVal cx As Int32, ByVal cy As Int32, ByVal wFlags As Int32) As Int32
Public Sub GetCursorPos(ByRef mouse_x As Int32, ByRef mouse_Y As Int32)
Dim pt As POINT
Call M_GetCursorPos(pt)
mouse_x = pt.x
mouse_Y = pt.y
End Sub

Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar = vbTab Then
Application.Exit()
End If
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim x1, y1 As Int32
GetCursorPos(x1, y1)
Dim icolor As Int32 = 0
icolor = GetPixel(GetDC(0), x1, y1)
Dim r, g, b As Byte
r = icolor And 255
g = (icolor \ 256) And 255
b = (icolor \ 65536) And 255
PictureBox1.BackColor = Color.FromArgb(r, g, b)
Dim hexcolor As String = "#" & Hex(PictureBox1.BackColor.ToArgb).ToString.Substring(2)
lblHex.Text = hexcolor
lblHex.BackColor = Color.FromArgb(r, g, b)
SetWindowPos(Handle.ToInt32, -1, x1 + 15, y1 - 5, 35, 35, &H1S)

Dim ri As Integer = r
Dim gi As Integer = g
Dim bi As Integer = b

If r = 255 And g = 255 And b = 255 Then
lblKleur.Text = "Wit"
ElseIf r = 0 And g = 0 And b = 0 Then
lblKleur.Text = "Zwart"
ElseIf r > g And r > b Then
lblKleur.Text = "Rood"
ElseIf g > r And g > b Then
lblKleur.Text = "Groen"
ElseIf b > r And b > g Then
lblKleur.Text = "Blauw"
ElseIf (ri + bi) > gi Then
lblKleur.Text = "Paars"
ElseIf (ri + gi) > bi Then
lblKleur.Text = "Geel"
Else
lblKleur.Text = "Onbekend"
End If
End Sub


Private Sub lblHex_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblHex.Click

End Sub
End Class

Kan iemand de eenvoudige kleuren + bruin/ grijs / oranje/rose laten werken zonder te falen :P?

Bedankt op voorhand.

Tom
 
Jouw probleem zit hem in de manier waarop jij een kleur 'benoemd'. Wit is bij jou #FFFFFF. Als een pixel een hele kleine tint lichter is (bijvoorbeeld #F7F7F7) dan zien wij dit nog als wit maar jouw code bestempeld dit al snel als paars. Je definities van de RGB-waarde naar een kleurbenaming is veel te bekrompen. In de meeste gevallen is de kleurnaam de benaming van de R, G, of B waarde die het meest voorkomt in de pixel.

Stel dat je iets lichter dan wit hebt (bijvoorbeeld #FFFEFE) dan wordt dit ogenblikkelijk gezien als rood. Het zal niet meevallen om dit goed te krijgen. In mijn optiek moet je een tabel aanleggen met RGB-waarde met bijbehorende benaming. Op http://web.njit.edu/~kevin/rgb.txt.html krijg je een aardige indruk hoe zo'n tabel er uit kan komen te zien. Voor de ontbrekende waarden in je tabel zul je moeten kijken naar de dichtsbij gelegen waarde en deze als kleur nemen.

Ik hoop dat je hier wat aan hebt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan