Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Visual basic 2005 Strumento secchiello  programma grafica
Forum - C# / VB.NET - Visual basic 2005 Strumento secchiello programma grafica

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 11:43
Mercoledì, 17/06/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 :hail:


Bisogna vivere come si pensa,altrimenti si finirà per pensare a come si è vissuto.
P.  Bourget
L'unica differenza tra le persone sta nella quantità di pazia che hanno.
Antonio Bannò
Un mano tesa, nel vuoto del bisogno, può arrivare a toccare l'anima
PM Quote
Avatar
Jeremy (Normal User)
Pro


Messaggi: 134
Iscritto: 08/02/2009

Segnala al moderatore
Postato alle 22:35
Mercoledì, 17/06/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

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:52
Giovedì, 18/06/2009
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).


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 21:26
Giovedì, 18/06/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


Bisogna vivere come si pensa,altrimenti si finirà per pensare a come si è vissuto.
P.  Bourget
L'unica differenza tra le persone sta nella quantità di pazia che hanno.
Antonio Bannò
Un mano tesa, nel vuoto del bisogno, può arrivare a toccare l'anima
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:09
Venerdì, 19/06/2009
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

  1. Dim P As Point 'punto dove hai cliccato col secchiello
  2. 'B è la bitmap in questione
  3. Dim Points As New List(Of Point)
  4. Dim NewPoints As New List(of Point)
  5.  
  6. Points.Add(P)
  7. Do
  8.   Try
  9.     For Each K As Point In Points
  10.       Dim Temp As Int32
  11.       Dim J As Point
  12.       'testa il punto a destra di questo
  13.       J = New Point(K.X - 1, K.Y)
  14.       Temp = Treshold(B, K, J) < Tolerance
  15.       If (Temp < Tolerance) And (Temp > 0) Then
  16.         B.SetPixel(J, SelectedColor)
  17.         NewPoints.Add(J)
  18.       End If
  19.       'ripeti con le altre direzioni
  20.   Catch Ex As Exception
  21.   End Try
  22.   Points.Clear()
  23.   Points.AddRange(NewPoints)
  24.   NewPoints.Clear()
  25. Loop Until NewPoints.Count = 0




"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 13:54
Domenica, 21/06/2009
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
Codice sorgente - presumibilmente VB.NET

  1. 'Strumento secchiello
  2.     Public Function Area(ByVal P As Point, ByVal img As Bitmap) As Bitmap
  3.         'P punto dove hai cliccato col secchiello
  4.         'B è la bitmap In questione
  5.         Dim Points As New List(Of Point)
  6.         Dim NewPoints As New List(Of Point)
  7.         Dim ColoreAttuale As Color = Nothing
  8.         Dim ColoreDACambiare As Color = img.GetPixel(P.X, P.Y)
  9.  
  10.         Points.Add(P)
  11.         Do
  12.             Try
  13.                 For Each K As Point In Points
  14.                     Dim J As Point
  15.                     Dim d As Point
  16.                     Dim s As Point
  17.                     Dim Sot As Point
  18.                     'testa il punto a destra di questo
  19.                     If K.X > 0 Then
  20.                         J = New Point(K.X - 1, K.Y)
  21.  
  22.                     End If
  23.  
  24.                     ColoreAttuale = img.GetPixel(J.X, J.Y)
  25.                     If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then 'Funzione Di Confronto Colore con coefficente
  26.                         If Points.IndexOf(J) = -1 Then
  27.                             img.SetPixel(J.X, J.Y, BrushBtn.BackColor)
  28.                             NewPoints.Add(J)
  29.                         End If
  30.                     End If
  31.                     If d.X < img.Width - 1 Then
  32.                         d = New Point(K.X + 1, K.Y)
  33.  
  34.                     End If
  35.  
  36.                     ColoreAttuale = img.GetPixel(d.X, d.Y)
  37.                     If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then
  38.                         If Points.IndexOf(d) = -1 Then
  39.                             img.SetPixel(d.X, d.Y, BrushBtn.BackColor)
  40.                             NewPoints.Add(d)
  41.                         End If
  42.                     End If
  43.                     If K.Y > 0 Then
  44.                         s = New Point(K.X, K.Y - 1)
  45.  
  46.                     End If
  47.  
  48.                     ColoreAttuale = img.GetPixel(s.X, s.Y)
  49.                     If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then
  50.                         If Points.IndexOf(s) = -1 Then
  51.                             img.SetPixel(s.X, s.Y, BrushBtn.BackColor)
  52.                             NewPoints.Add(s)
  53.                         End If
  54.                     End If
  55.  
  56.                     If Sot.Y < img.Height - 1 Then
  57.                         Sot = New Point(K.X, K.Y + 1)
  58.  
  59.                     End If
  60.  
  61.                     ColoreAttuale = img.GetPixel(Sot.X, Sot.Y)
  62.                     If OpIma.IsNearestColor(ColoreAttuale, ColoreDACambiare, 10) = True Then
  63.                         If Points.IndexOf(Sot) = -1 Then
  64.                             img.SetPixel(Sot.X, Sot.Y, BrushBtn.BackColor)
  65.                             NewPoints.Add(Sot)
  66.                         End If
  67.                     End If
  68.                 Next
  69.  
  70.             Catch ex As Exception
  71.                 MsgBox(ex.Message)
  72.             End Try
  73.  
  74.  
  75.  
  76.             Points.Clear()
  77.             Points.AddRange(NewPoints)
  78.             NewPoints.Clear()
  79.  
  80.         Loop Until Points.Count = 0
  81.  
  82.         Return img
  83.  
  84.     End Function


Ultima modifica effettuata da Federico1976 il 24/06/2009 alle 13:41


Bisogna vivere come si pensa,altrimenti si finirà per pensare a come si è vissuto.
P.  Bourget
L'unica differenza tra le persone sta nella quantità di pazia che hanno.
Antonio Bannò
Un mano tesa, nel vuoto del bisogno, può arrivare a toccare l'anima
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:08
Lunedì, 22/06/2009
Per "figura" cosa intendi?


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 12:40
Lunedì, 22/06/2009
Scusa ai ragione Un elissi un quadrato ecc.. Una forma geometrica

Ultima modifica effettuata da Federico1976 il 22/06/2009 alle 12:42


Bisogna vivere come si pensa,altrimenti si finirà per pensare a come si è vissuto.
P.  Bourget
L'unica differenza tra le persone sta nella quantità di pazia che hanno.
Antonio Bannò
Un mano tesa, nel vuoto del bisogno, può arrivare a toccare l'anima
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:48
Martedì, 23/06/2009
Umh... non so. Non è che puoi mandarmi uno screenshot o il progetto zippato?


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo