Dessiner un halo de couleur

Contenu du snippet

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

A voir également

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.