Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - copiare una parte di un' immagine [VB. Net]
Forum - C# / VB.NET - copiare una parte di un' immagine [VB. Net]

Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 19:57
Domenica, 25/11/2012
Ciao a tutti, stavo creando un software per la modifica delle immagini però ho un problema: dovrei creare una funzione in grado di copiare in una PictureBox l'immagine contenuta in una spezzata chiusa tracciata dall'utente (tramite un'altra PictureBox), dovrei ottenere un effetto simile all'immagine allegata ma non so come fare. :_doubt:
Potreste aiutarmi? Grazie! :)

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 0:42
Lunedì, 26/11/2012

secondo me una buona idea sarebbe quella di usare un po di matematica.
ogni segmento della spezzata individua una retta, e lo spazio all'interno del contorno si può vedere come l'insieme dei punti che verificano le N disequazioni delle rette che fanno parte della spezzata.

risolvi il sistema di disequazioni e hai gli intervalli di punti, dopodichè li copi dove ti pare :)

PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 145
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 10:25
Lunedì, 26/11/2012
Che ne dici invece di utilizzare l'oggetto Graphics e il metodo Xor della region selezionata?

PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 15:02
Lunedì, 26/11/2012
Ho risolto! :D
Se a qualcuno potesse servire ecco il codice che ho usato (ho creato una funzione):

Codice sorgente - presumibilmente VB.NET

  1. Function TagliaImmagine(ByVal immagine As Bitmap, ByVal punti As List(Of Point))
  2. Dim g As Graphics
  3. Dim perimetro As System.Drawing.Drawing2D.GraphicsPath
  4. Dim res As Bitmap
  5. Dim tmpimg As Bitmap
  6. If punti.Count >= 1 Then
  7. perimetro = New System.Drawing.Drawing2D.GraphicsPath()
  8. perimetro.AddPolygon(punti.ToArray)
  9. tmpimg = New Bitmap(immagine)
  10. g = Graphics.FromImage(tmpimg)
  11. g.ExcludeClip(New Region(perimetro))
  12. g.Clear(Color.Transparent)
  13. g.Dispose()
  14. Dim rect As RectangleF = perimetro.GetBounds()
  15. res = New Bitmap(rect.Size.ToSize.Width, rect.Size.ToSize.Height)
  16. g = Graphics.FromImage(res)
  17. g.DrawImage(tmpimg, New Rectangle(New Point(0 - rect.Left.ToString, 0 - rect.Top.ToString), tmpimg.Size))
  18. g.Dispose()
  19. Else
  20. res = immagine
  21. End If
  22. Return res
  23. End Function


Ultima modifica effettuata da Uno sciame di API il 26/11/2012 alle 17:33
PM Quote