| |

VB.NET - FortgeschritteneRe: 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  |  |
 | 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 |
  |
|
sevGraph (VB/VBA) 
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
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
|
|