vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Frage zu ExtFloodFill 
Autor: GPM
Datum: 06.03.08 03:29

Es geht aber auch ohne API in Net schnell genug. Eine einfache Demo als Test:
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices.Marshal
 
Public Class Form1
    Dim bmp As New Bitmap(1024, 768, PixelFormat.Format24bppRgb), g As Graphics _
      = Graphics.FromImage(bmp)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles MyBase.Load
        Me.SetBounds(0, 0, 1024, 768)
        PictureBox1.SetBounds(0, 0, bmp.Width, bmp.Height)
        g.Clear(Color.Silver)
        g.DrawRectangle(Pens.Black, 100, 200, 800, 300)
        g.DrawEllipse(Pens.Blue, 300, 250, 400, 400)
        g.DrawEllipse(Pens.Green, 150, 100, 650, 500)
        PictureBox1.Image = bmp
    End Sub
 
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As _
      System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        Dim col As Color = IIf(e.Button = Windows.Forms.MouseButtons.Left, _
        Color.Red, Color.Gold)
        Dim pcol As Color = bmp.GetPixel(e.X, e.Y)                 ' Pixelcolor 
        ' unter Mauszeiger
        If pcol.ToArgb <> col.ToArgb Then                          ' nur bei 
        ' abweichender Farbe
            Dim newcol() As Byte = {col.B, col.G, col.R}
            Dim oldcol() As Byte = {pcol.B, pcol.G, pcol.R}
            Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
            Dim bd As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, _
              PixelFormat.Format24bppRgb)
            Dim zb As Int32 = bd.Stride                            ' Die 
            ' Zeilenbreite in Byte
            Dim fw((zb * bmp.Height) - 1) As Byte                  ' Array für 
            ' Farbwerte
            Copy(bd.Scan0, fw, 0, fw.Length)                       ' 
            ' Pixelfarben in das Array kopieren
            Dim st As New Stack(Of Int32)                          ' Stack für 
            ' die noch zu untersuchende Punkte
            Dim pos As Int32 = (e.X * 3) + (e.Y * zb)              ' Position 
            ' im Array
            Array.Copy(newcol, 0, fw, pos, 3)                      ' Farbwerte 
            ' für Punkt x,y setzen
            st.Push(pos)                                           ' Position 
            ' für Punkt x,y auf den Stack
            Dim xp, p As Int32                                     ' aktuelle 
            ' X-Position, Position
            Do
                p = st.Pop                                         ' Position 
                ' für Test auf: oben,unten,rechts,links 
                If p > zb AndAlso fw(p - zb) = oldcol(0) AndAlso fw(p - zb + _
                  1) = oldcol(1) AndAlso fw(p - zb + 2) = oldcol(2) Then
                    Array.Copy(newcol, 0, fw, p - zb, 3)           ' Farbwert 
                    ' für x,y-1 setzen
                    st.Push(p - zb)                                ' Position 
                    ' für neuen Test sichern
                End If
                If p < fw.Length - zb AndAlso fw(p + zb) = oldcol(0) AndAlso fw( _
                  p + zb + 1) = oldcol(1) AndAlso fw(p + zb + 2) = oldcol(2) _
                  Then
                    Array.Copy(newcol, 0, fw, p + zb, 3)           ' Farbwert 
                    ' für x,y+1 setzen
                    st.Push(p + zb)
                End If
                xp = p Mod zb
                If xp < zb - 3 AndAlso fw(p + 3) = oldcol(0) AndAlso fw(p + 4) _
                  = oldcol(1) AndAlso fw(p + 5) = oldcol(2) Then
                    Array.Copy(newcol, 0, fw, p + 3, 3)            ' Farbwert 
                    ' für x+1,y setzen
                    st.Push(p + 3)
                End If
                If xp > 2 AndAlso fw(p - 3) = oldcol(0) AndAlso fw(p - 2) = _
                  oldcol(1) AndAlso fw(p - 1) = oldcol(2) Then
                    Array.Copy(newcol, 0, fw, p - 3, 3)            ' Farbwert 
                    ' für x-1,y setzen
                    st.Push(p - 3)
                End If
            Loop While st.Count > 0                                ' Weiter 
            ' bis der Stack leer ist
            Copy(fw, 0, bd.Scan0, fw.Length)                       ' 
            ' Arrayinhalt zurückschreiben
            bmp.UnlockBits(bd)                                     ' Bitmap 
            ' freigeben
            PictureBox1.Invalidate()                               ' und noch 
            ' anzeigen
        End If
    End Sub
End Class
MfG GPM
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Frage zu ExtFloodFill2.170Oliver50005.03.08 20:02
Re: Frage zu ExtFloodFill1.252Oliver50005.03.08 20:16
Re: Frage zu ExtFloodFill1.661GPM06.03.08 03:29
Re: Frage zu ExtFloodFill1.262Oliver50006.03.08 17:47
Re: Frage zu ExtFloodFill1.239Melkor06.03.08 18:20
Re: Frage zu ExtFloodFill1.309GPM07.03.08 01:41

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel