vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 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 - Fortgeschrittene
Re: Grafik- Bild mit linearem Gradient maskieren?? 
Autor: Snof
Datum: 24.03.09 11:02

Ich hab mal was gebastelt. Man braucht 3 Buttons und eine PictureBox (picTest).
Public Class Form1
 
    Private enState As state
 
    Enum state
        none
        setP1
        setP2
    End Enum
 
    Private p1 As Point
    Private p2 As Point
 
    Private img1 As New Bitmap("...")
    Private img2 As New Bitmap("...")
 
    Private Sub Button1_Click(...) Handles Button1.Click
        enState = state.setP1
    End Sub
 
    Private Sub Button2_Click(...) Handles Button2.Click
        enState = state.setP2
    End Sub
 
    Private Sub picTest_MouseUp(...) Handles picTest.MouseUp
        Select Case enState
            Case state.setP1
                p1 = e.Location
                enState = state.none
 
            Case state.setP2
                p2 = e.Location
                enState = state.none
 
        End Select
    End Sub
 
    Private Sub Button3_Click(...) Handles Button3.Click
 
        Dim w As Integer = picTest.ClientSize.Width
        Dim h As Integer = picTest.ClientSize.Height
 
        Dim bmp As New Bitmap(w, h)
 
        ' P2 nach der Verschiebung (P2')
        Dim p3 As New Point(p2.X - p1.X, p2.Y - p1.Y)
 
        Dim alpha As Double
 
        If p3.Y = 0 Then
            ' P2' liegt auf der x-Achse
 
            If p3.X < 0 Then
                alpha = Math.PI
            End If
 
        ElseIf p3.X = 0 Then
            ' P2' liegt auf der y-Achse
 
            If p3.Y < 0 Then
                alpha = 1.5 * Math.PI
            End If
 
            If p3.Y > 0 Then
                alpha = 0.5 * Math.PI
            End If
 
        ElseIf p3.X > 0 Then
            alpha = Math.Atan(p3.Y / p3.X)
 
        ElseIf p3.X < 0 Then
            alpha = Math.PI + Math.Atan(p3.Y / p3.X)
 
        End If
 
        Dim sin_alpha As Double = Math.Sin(alpha)
        Dim cos_alpha As Double = Math.Cos(alpha)
 
        ' Hilfsvariable
        Dim c As Double = -p1.X * cos_alpha - p1.Y * sin_alpha
 
        ' x-Koordinate von P2 nach der Verschiebung und Rotation
        Dim x2 As Double = p2.X * cos_alpha + p2.Y * sin_alpha + c
 
        ' Pixel bestimmen
        For y As Integer = 0 To h - 1
            For x As Integer = 0 To w - 1
 
                Dim xq As Double = x * cos_alpha + y * sin_alpha + c
 
                ' Dim t As Integer = CInt(xq * 255 / x2)
                Dim t As Double = xq / x2
 
                If t < 0 Then
                    t = 0
                End If
 
                ' If t > 255 Then
                '     t = 255
                ' End If
                If t > 1 Then
                    t = 1
                End If
 
                Dim cl1 As Color = img1.GetPixel(x, y)
                Dim cl2 As Color = img2.GetPixel(x, y)
 
                Dim r As Integer = CInt(t * cl1.R + (1 - t) * cl2.R)
                Dim g As Integer = CInt(t * cl1.G + (1 - t) * cl2.G)
                Dim b As Integer = CInt(t * cl1.B + (1 - t) * cl2.B)
 
                ' bmp.SetPixel(x, y, Color.FromArgb(t, t, t))
                bmp.SetPixel(x, y, Color.FromArgb(r, g, b))
            Next
        Next
 
        picTest.Image = bmp
    End Sub
End Class
Das Hauptproblem ist die Berechnung des Transparenzwertes. Entscheident dafür ist, wo sich ein Punkt im Verhhältnis zu P1 und P2 befindet.
Die Idee zu Lösung des Problems: Zuerst wird eine verschiebung gemacht, so dass P1 im Koordinatenursprung liegt. Danach kommt eine Rotation, um P2 auf den positiven Bereich der x-Achse zu bringen. Das Verhältnis der neuen x-Koordinaten vom P2 und dem gesuchten Punkt gibt dann den Transparenzwert an.

Mit homogenen Koordinaten lässt sich die ganze Transformation in einer Matrix zusammenfassen. Da aber nur die x-Werte relevant sind, habe ich auch nur den dafür notwendigen Teil implementiert.

In der Schleife selbst gibt es dann zwei Möglichkeiten: Entweder zwei Bilder vermischen, wobei t zwischen 0 und 1 liegt und mit den Farbwerten der beiden Bilder verrechnet wird. Oder es wird lediglich ein Graustufenbild erzeugt (im Code auskommentiert), wobei t zwischen 0 und 255 liegt und direkt den Farbwert bestimmt.

Das ganze Verfahren ist vermutlich nicht das schnellste, aber es funktioniert
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Grafik- Bild mit linearem Gradient maskieren??1.411dh16.03.09 16:26
Re: Grafik- Bild mit linearem Gradient maskieren??855dfense18.03.09 11:40
Re: Grafik- Bild mit linearem Gradient maskieren??787dh18.03.09 16:57
Re: Grafik- Bild mit linearem Gradient maskieren??836Kuno6021.03.09 14:56
Re: Grafik- Bild mit linearem Gradient maskieren??796dh21.03.09 16:51
Re: Grafik- Bild mit linearem Gradient maskieren??801dh23.03.09 17:50
Re: Grafik- Bild mit linearem Gradient maskieren??779Snof23.03.09 23:09
Re: Grafik- Bild mit linearem Gradient maskieren??749dh23.03.09 23:17
Re: Grafik- Bild mit linearem Gradient maskieren??762Snof24.03.09 11:02

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