Oppure

Loading
17/06/09 9:43
Federico1976
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 :hail:
aaa
17/06/09 20:35
Jeremy
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
aaa
18/06/09 7:52
Il Totem
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# > richnewman.wordpress.com/2007/05/07/using-hsl-color-hue-saturation-luminosity-to-create-better-looking-guis-part-2/
vb > totem.altervista.org/appunti/…
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).
aaa
18/06/09 19:26
Federico1976
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
aaa
19/06/09 8:09
Il Totem
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!):
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

aaa
21/06/09 11:54
Federico1976
Grazie Totem :k:
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
     '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 24/06/09 11:41
aaa
22/06/09 8:08
Il Totem
Per "figura" cosa intendi?
aaa
22/06/09 10:40
Federico1976
Scusa ai ragione Un elissi un quadrato ecc.. Una forma geometrica
Ultima modifica effettuata da Federico1976 22/06/09 10:42
aaa