Federico1976 (Normal User)
Rookie
Messaggi: 42
Iscritto: 23/03/2009
|
Salve Vorrei inplementare il programma di grafica con lo strumento secchillo per riempire un'area ma non so di dove partire esiste una classe ?
o devo prelevare pixel per pixel ?
in quale modo
Vi ringrazioo Anticipatamente dell'aiuto
|
|
Jeremy (Normal User)
Pro
Messaggi: 134
Iscritto: 08/02/2009
|
Ciao.
Devi usare l'oggetto Graphics del form che ti viene restituito come parametro nella gestione dell'evento OnPaint del Form.
Sotto il Namespace System.Drawing, trovi tutti i metodi necessari per sfruttare l'oggetto Graphics.
Ciao
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Ma in Graphics non c'è lo strumento 'secchiello'. Mi sa che devi confrontare i pixel uno alla volta, confrontando il primo (quello dove clicchi) con gli altri adiacenti, e questi a loro volte con i pixel antistanti, come in un effetto a cascata. Ricorda che devi anche consideare colori molto simili ma non uguali: per questo ti consiglio di usare la classe HslColor di Rich Newman, che trovi in questi siti:
C# > http://richnewman.wordpress.com/2007/05/07/using-hsl-color ...
vb > http://totem.altervista.org/appunti/view.php?id=11
Inoltre, ti devo dire che le funzioni GetPixel e SetPixel sono molto lente, e sarebbe meglio effettuare l'operazione in memoria (codice unsafe dal punto di vista .net).
|
|
Federico1976 (Normal User)
Rookie
Messaggi: 42
Iscritto: 23/03/2009
|
Grazie delle risposte
Pero non mi Riesce capire ,Se la figura mi risultasse aperta
Tipo un elisse con un punto del diametro Cancellato o del colore dell'area
dovrei colorare anche al suo esterno fino alle aree delimitate da altri colori
puoi farmi un esempio
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Dato che non ho voglia di smanettare con l'hsl ora, ipotizziamo di avere una funzione Treshold, che ci dice quando i due colori sono simili, restituendo un numero intero: se 0, i due colori sono identici. Ammettiamo anche di avere un valore di tolleranza Tolerance, che esprime quanta diversità possano avere due colori per essere considerati simili. Il codice sarebbe simile a questo, anche se per comodità uso le funzioni di bitmap (e sarebbe meglio fare tutto in memoria!):
Codice sorgente - presumibilmente VB.NET |
Dim P As Point 'punto dove hai cliccato col secchiello 'B è la bitmap in questione Dim Points As New List(Of Point) Dim NewPoints As New List(of Point) Points.Add(P) Do Try For Each K As Point In Points Dim Temp As Int32 Dim J As Point 'testa il punto a destra di questo J = New Point(K.X - 1, K.Y) Temp = Treshold(B, K, J) < Tolerance If (Temp < Tolerance) And (Temp > 0) Then B.SetPixel(J, SelectedColor) NewPoints.Add(J) End If 'ripeti con le altre direzioni Catch Ex As Exception End Try Points.Clear() Points.AddRange(NewPoints) NewPoints.Clear() Loop Until NewPoints.Count = 0
|
|
|
Federico1976 (Normal User)
Rookie
Messaggi: 42
Iscritto: 23/03/2009
|
Grazie Totem
Ho Quasi risolto con Dei Piccoli problemi
in pratica quando clicco al di fuori di una figura mi colora un rombo delle dimensioni
variabili asseconda di dove clicco
se invece clicco dentro una figura funziona tutto regolare
posto il codice magari potrebbe servire
-----------------------------------------------------------------------------------------------
Codice Rivisionato
Codice sorgente - presumibilmente VB.NET |
'Strumento secchiello Public Function Area(ByVal P As Point, ByVal img As Bitmap) As Bitmap 'P punto dove hai cliccato col secchiello 'B è la bitmap In questione Dim Points As New List(Of Point) Dim NewPoints As New List(Of Point) Dim ColoreAttuale As Color = Nothing Dim ColoreDACambiare As Color = img.GetPixel(P.X, P.Y) Points.Add(P) Do Try For Each K As Point In Points Dim J As Point Dim d As Point Dim s As Point Dim Sot As Point 'testa il punto a destra di questo If K.X > 0 Then J = New Point(K.X - 1, K.Y) End If ColoreAttuale = img.GetPixel(J.X, J.Y) If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then 'Funzione Di Confronto Colore con coefficente If Points.IndexOf(J) = -1 Then img.SetPixel(J.X, J.Y, BrushBtn.BackColor) NewPoints.Add(J) End If End If If d.X < img.Width - 1 Then d = New Point(K.X + 1, K.Y) End If ColoreAttuale = img.GetPixel(d.X, d.Y) If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then If Points.IndexOf(d) = -1 Then img.SetPixel(d.X, d.Y, BrushBtn.BackColor) NewPoints.Add(d) End If End If If K.Y > 0 Then s = New Point(K.X, K.Y - 1) End If ColoreAttuale = img.GetPixel(s.X, s.Y) If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then If Points.IndexOf(s) = -1 Then img.SetPixel(s.X, s.Y, BrushBtn.BackColor) NewPoints.Add(s) End If End If If Sot.Y < img.Height - 1 Then Sot = New Point(K.X, K.Y + 1) End If ColoreAttuale = img.GetPixel(Sot.X, Sot.Y) If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then If Points.IndexOf(Sot) = -1 Then img.SetPixel(Sot.X, Sot.Y, BrushBtn.BackColor) NewPoints.Add(Sot) End If End If Next Catch ex As Exception MsgBox(ex.Message) End Try Points.Clear() Points.AddRange(NewPoints) NewPoints.Clear() Loop Until Points.Count = 0 Return img End Function
|
Ultima modifica effettuata da Federico1976 il 24/06/2009 alle 13:41 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Per "figura" cosa intendi?
|
|
Federico1976 (Normal User)
Rookie
Messaggi: 42
Iscritto: 23/03/2009
|
Scusa ai ragione Un elissi un quadrato ecc.. Una forma geometrica
Ultima modifica effettuata da Federico1976 il 22/06/2009 alle 12:42 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Umh... non so. Non è che puoi mandarmi uno screenshot o il progetto zippato?
|
|