Mit dem Korrektur-Pinsel Soften können Sie Teile eines Bildes nachträglich und pinselgenau weichzeichnen. Erstellen Sie ein neues Projekt und platzieren folgende Controls auf die Form:
Nachfolgender Code sollte in ein Modul eingefügt werden: Option Explicit ' benötigte API-Deklarationen Private Declare Function SetPixelV Lib "gdi32" ( _ ByVal hDC As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal crColor As Long) As Long Public Declare Function GetPixel Lib "gdi32" ( _ ByVal hDC As Long, _ ByVal X As Long, _ ByVal Y As Long) As Long Public Sub SoftenBlur(Target As Long, X As Single, Y As Single, _ radius As Long, Steps As Long, Alpha As Integer) Dim cX As Long Dim cY As Long Dim TempColor(3) As Long Dim TempRadius As Integer Dim I As Integer Dim u As Integer Dim Red(3) As Long Dim Green(3) As Long Dim Blue(3) As Long Dim Color0 As Long Dim Color1 As Long Dim Color2 As Long Dim Color3 As Long Dim Done() As Boolean ReDim Done(-radius To radius, -radius To radius) For I = 1 To Steps TempRadius = radius / Steps * I For cX = -TempRadius To TempRadius ' Step 2 For cY = -TempRadius To TempRadius ' Step 2 If Not Done(cX, cY) Then If (cX * cX) + (cY * cY) <= TempRadius * TempRadius Then TempColor(0) = GetPixel(Target, cX + X, cY + Y) TempColor(1) = GetPixel(Target, cX + X, cY + Y - 1) TempColor(2) = GetPixel(Target, cX + X - 1, cY + Y - 1) TempColor(3) = GetPixel(Target, cX + X - 1, cY + Y) For u = 0 To 3 ' ==> RGB + Fehlerbehandlung Blue(u) = TempColor(u) \ 65536 Green(u) = (TempColor(u) - Blue(u) * 65536) \ 256 Red(u) = TempColor(u) - Blue(u) * 65536 - Green(u) * 256 If Red(u) < 0 Then Red(u) = 0 If Red(u) > 255 Then Red(u) = 255 If Green(u) < 0 Then Green(u) = 0 If Green(u) > 255 Then Green(u) = 255 If Blue(u) < 0 Then Blue(u) = 0 If Blue(u) > 255 Then Blue(u) = 255 Next u Color0 = RGB(((Red(0) * Alpha) + Red(1) + Red(2) + Red(3)) / (Alpha + 3), _ ((Green(0) * Alpha) + Green(1) + Green(2) + Green(3)) / (Alpha + 3), _ ((Blue(0) * Alpha) + Blue(1) + Blue(2) + Blue(3)) / (Alpha + 3)) Color1 = RGB((Red(0) + (Red(1) * Alpha) + Red(2) + Red(3)) / (Alpha + 3), _ (Green(0) + (Green(1) * Alpha) + Green(2) + Green(3)) / (Alpha + 3), _ (Blue(0) + (Blue(1) * Alpha) + Blue(2) + Blue(3)) / (Alpha + 3)) Color2 = RGB((Red(0) + Red(1) + (Red(2) * Alpha) + Red(3)) / (Alpha + 3), _ (Green(0) + Green(1) + (Green(2) * Alpha) + Green(3)) / (Alpha + 3), _ (Blue(0) + Blue(1) + (Blue(2) * Alpha) + Blue(3)) / (Alpha + 3)) Color3 = RGB((Red(0) + Red(1) + Red(2) + (Red(3) * Alpha)) / (Alpha + 3), _ (Green(0) + Green(1) + Green(2) + (Green(3) * Alpha)) / (Alpha + 3), _ (Blue(0) + Blue(1) + Blue(2) + (Blue(3) * Alpha)) / (Alpha + 3)) SetPixelV Target, cX + X, cY + Y, Color0 SetPixelV Target, cX + X, cY + Y - 1, Color1 SetPixelV Target, cX + X - 1, cY + Y - 1, Color2 SetPixelV Target, cX + X - 1, cY + Y, Color3 Done(cX, cY) = True End If End If Next cY Next cX Next I End Sub Und jetzt noch der Code für die Form. Hier soll beim Klick und Ziehen mit der Maus auf das Bild der Bereich unter dem Mauszeiger (Kreis) je nach eingestellter Intensität (HScroll2) weich gezeichnet werden. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Kreis anzeigen shCircle.Visible = False End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Bereich unter dem Mauszeiger weichzeichnen Picture1.AutoRedraw = True SoftenBlur Picture1.hDC, X, Y, (Val(HScroll1.Value) / 2), _ Val(3), Abs(HScroll2.Value - 255) '1 - 100 DoEvents Picture1.Refresh DoEvents End Sub Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) ' Kreis mit Maus bewegen shCircle.Visible = True shCircle.Width = HScroll1.Value shCircle.Height = shCircle.Width shCircle.Left = X - HScroll1.Value / 2 shCircle.Top = Y - HScroll1.Value / 2 If Button = 1 Then ' Bereich unter dem Mauszeiger weichzeichnen SoftenBlur Picture1.hDC, X, Y, (Val(HScroll1.Value) / 2), Val(3), _ Abs(HScroll2.Value - 255) '1 - 100 DoEvents Picture1.Refresh DoEvents Exit Sub End If End Sub Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Picture1.AutoRedraw = False End Sub Dieser Tipp wurde bereits 6.932 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. 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 |
||||||||||||||||
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. |