dessine un halo coloré en fonction de la couleur choisie,
bit: image bitmap, l : position x, t : position y, couleur : ex "vert", diamètre_noyau : luminosité intérieure, diamètre2: nécessairement supérieure au diamètre du noyau, diamètre3: pour les couleurs composées (ex: "rose et bleu") et supérieure au diamètre 2
j'ai essayé de l'optimiser comme je pouvait afin qu'il soit le plus rapide possible
Source / Exemple :
Function halo(ByVal bit As Bitmap, ByVal l As Integer, ByVal t As Integer, ByVal couleurs As String, ByVal diametre_noyau_en_pixel As Integer, ByVal diametre_2_en_pixel As Integer, Optional ByVal diametre_3_en_pixel As Integer = 1)
Dim dist_rouge, dist_vert, dist_bleu As Single
Select Case couleurs
Case Is = "blanc"
dist_rouge = 255 / diametre_noyau_en_pixel * 2
dist_vert = 255 / diametre_noyau_en_pixel * 2
dist_bleu = 255 / diametre_noyau_en_pixel * 2
Case Is = "rouge"
dist_rouge = 255 / diametre_2_en_pixel * 2
dist_vert = 255 / diametre_noyau_en_pixel * 2
dist_bleu = 255 / diametre_noyau_en_pixel * 2
Case Is = "vert"
dist_rouge = 255 / diametre_noyau_en_pixel * 2
dist_vert = 255 / diametre_2_en_pixel * 2
dist_bleu = 255 / diametre_noyau_en_pixel * 2
Case Is = "bleu"
dist_rouge = 255 / diametre_noyau_en_pixel * 2
dist_vert = 255 / diametre_noyau_en_pixel * 2
dist_bleu = 255 / diametre_2_en_pixel * 2
Case Is = "jaune"
dist_rouge = 255 / diametre_2_en_pixel * 2
dist_vert = 255 / diametre_2_en_pixel * 2
dist_bleu = 255 / diametre_noyau_en_pixel * 2
Case Is = "rose"
dist_rouge = 255 / diametre_2_en_pixel * 2
dist_vert = 255 / diametre_noyau_en_pixel * 2
dist_bleu = 255 / diametre_2_en_pixel * 2
Case Is = "turquoise"
dist_rouge = 255 / diametre_noyau_en_pixel * 2
dist_vert = 255 / diametre_2_en_pixel * 2
dist_bleu = 255 / diametre_2_en_pixel * 2
Case Is = "jaune et rouge"
dist_rouge = 255 / diametre_2_en_pixel * 2
dist_vert = 255 / diametre_noyau_en_pixel * 2
dist_bleu = 255 / diametre_3_en_pixel * 2
Case Is = "jaune et vert"
dist_rouge = 255 / diametre_noyau_en_pixel * 2
dist_vert = 255 / diametre_2_en_pixel * 2
dist_bleu = 255 / diametre_3_en_pixel * 2
Case Is = "rose et rouge"
dist_rouge = 255 / diametre_2_en_pixel * 2
dist_vert = 255 / diametre_3_en_pixel * 2
dist_bleu = 255 / diametre_noyau_en_pixel * 2
Case Is = "rose et bleu"
dist_rouge = 255 / diametre_noyau_en_pixel * 2
dist_vert = 255 / diametre_3_en_pixel * 2
dist_bleu = 255 / diametre_2_en_pixel * 2
Case Is = "turquoise et vert"
dist_rouge = 255 / diametre_3_en_pixel * 2
dist_vert = 255 / diametre_2_en_pixel * 2
dist_bleu = 255 / diametre_noyau_en_pixel * 2
Case Is = "turquoise et bleu"
dist_rouge = 255 / diametre_3_en_pixel * 2
dist_vert = 255 / diametre_noyau_en_pixel * 2
dist_bleu = 255 / diametre_2_en_pixel * 2
End Select
Dim r, g, b As Integer
Dim dist, rm, gm, bm As Integer
'méthode plus rapide que getpixel:
Dim diametre_max As Integer
If diametre_3_en_pixel > diametre_2_en_pixel Then
diametre_max = diametre_3_en_pixel
Else
If diametre_noyau_en_pixel > diametre_2_en_pixel Then
diametre_max = diametre_noyau_en_pixel
Else
diametre_max = diametre_2_en_pixel
End If
End If
Dim w1 As Integer = bit.Width
Dim h1 As Integer = bit.Height
Dim w2 As Integer = l - diametre_max / 2
Dim h2 As Integer = t - diametre_max / 2
Dim w3 As Integer = l + diametre_max / 2
Dim h3 As Integer = t + diametre_max / 2
If w2 < 0 Then w2 = 0
If h2 < 0 Then h2 = 0
If w3 > w1 Then w3 = w1
If h3 > h1 Then h3 = h1
Dim bmpData As Imaging.BitmapData = bit.LockBits(New Rectangle(0, 0, w1, h1), System.Drawing.Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format32bppArgb)
Dim newPixel(w1 * h1 * 4 - 1) As Byte
Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, newPixel, 0, newPixel.Length)
For w = w2 To w3 - 1 Step 1
For h = h2 To h3 - 1 Step 1
dist = Math.Round(Math.Sqrt((t - h) ^ 2 + Math.Abs(l - w) ^ 2), 0)
rm = 255 - dist * dist_rouge : If rm < 0 Then rm = 0
gm = 255 - dist * dist_vert : If gm < 0 Then gm = 0
bm = 255 - dist * dist_bleu : If bm < 0 Then bm = 0
'méthode plus rapide que setpixel:
r = newPixel((w1 * h + w) * 4 + 2) + rm
g = newPixel((w1 * h + w) * 4 + 1) + gm
b = newPixel((w1 * h + w) * 4 + 0) + bm
If r > 255 Then r = 255 : If r < 0 Then r = 0
If g > 255 Then g = 255 : If g < 0 Then g = 0
If b > 255 Then b = 255 : If b < 0 Then b = 0
newPixel((w1 * h + w) * 4 + 2) = r
newPixel((w1 * h + w) * 4 + 1) = g
newPixel((w1 * h + w) * 4 + 0) = b
Next
Next
Runtime.InteropServices.Marshal.Copy(newPixel, 0, bmpData.Scan0, newPixel.Length)
bit.UnlockBits(bmpData)
Return bit
End Function
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.