IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment merger deux images autrement que Pixel par Pixel


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Comment merger deux images autrement que Pixel par Pixel
    Bonjour à tous,

    Je combine actuellement 2 images comme le ferait Photoshop avec les calques en mode "Superposition". Je le fais pixel par pixel, ce qui est assez lent bien évidemment, voici le calcul que j'applique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                Case BlendMode.Ecran
                    R = Max(0, Min(255, 255 - (255 - col1.Color.R) * (255 - col2.Color.R) / 255))
                    G = Max(0, Min(255, 255 - (255 - col1.Color.G) * (255 - col2.Color.G) / 255))
                    B = Max(0, Min(255, 255 - (255 - col1.Color.B) * (255 - col2.Color.B) / 255))
                    BlendColor = CColor.FromRGB(R, G, B)
                    Exit Select
    J'aimerai savoir s'il est possible d'utiliser la librairie Systeme, ou les classes GDI+ pour faire la même chose en une seule passe ?

    D'avance merci à vous.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    dans tous les cas il faut traiter x octets, et ca sera toujours chacun son tour je pense

    après ceux qui font du traitement d'image travaillent sur un tableau d'octet, pas avec des colors et autres setpixel qui plombent les perfs (chercher lockbits et/ou marshal)
    éventuellement découper en plusieurs tableaux et utiliser des tasks/threads s'il y a beaucoup d'octets
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Comme dit par Pol63 ,pour aller plus vite Bitmap.LockBits dans GDI+...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Mars 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2019
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    bonjour

    Comme dit par Pol63 ,pour aller plus vite Bitmap.LockBits dans GDI+...
    Merci beaucoup, je vais voir pour faire çà avec un FOR Parallel... Je vous tiens au courant

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    rebonjour

    Voici un exemple code .vb du véloce Bitmap.LockBits ...

    l'exemple utilise un Class "maître jacques" de service qui fait appel à l'API Bitmap.LockBits...
    Il exécute un Sub dénommé BlendColor qui lui même mets en oeuvre l'exemple que tu as soumis dans ton post en un clin d’œil...
    Il te revient de développer d’autres méthodes de traitement semblables y compris avec des parametres convenables (attention au shift des "octets" de couleur) ...

    Code .vb du Class "maître jacques" dénommé LockBitmap:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    Imports System.Drawing.Imaging
    Imports System.Runtime.InteropServices
     
    Public Class LockBitmap
     
        Private BaseImageWidth As Integer
        Private BaseImageHeight As Integer
        Private TotalPixels As Integer
        Private ImageAddress As IntPtr
        Private ImageData As BitmapData
        Private ImageBuffer() As Integer
        Private baseImage As Bitmap
        Public Property Image() As Bitmap
            Get
                Return baseImage
            End Get
            Set(ByVal Value As Bitmap)
     
                baseImage = New Bitmap(Value.Width, Value.Height, Value.PixelFormat)
                Dim gr As Graphics
                gr = Graphics.FromImage(baseImage)
                gr.DrawImage(Value, 0, 0, Value.Width, Value.Height)
                gr.Dispose()
            End Set
        End Property
     
        Private Sub LockTheImage()
            ' ----- verrouillage de l'image en memoire 
            BaseImageWidth = baseImage.Width
            BaseImageHeight = baseImage.Height
            TotalPixels = BaseImageWidth * BaseImageHeight
     
            ' ----- Crée un buffer en memoire. 
            '       pour stocker une image  au format pixel 32 bit ARVB.
            '       le format pixel 32 bit ARVB necessite 4 octets 
            '       d'ou un buffer d'Integer car Integer exige 4 octets).
            ReDim ImageBuffer(TotalPixels - 1)
            ' ----- verrouille l'image en memoire 
            ImageData = baseImage.LockBits(
               New Rectangle(0, 0, BaseImageWidth,
               BaseImageHeight), ImageLockMode.ReadWrite,
               PixelFormat.Format32bppRgb)
            'lit l'adresse du 1er pixel ARGB
            ImageAddress = ImageData.Scan0
     
            ' ----- associe le buffer & l'image verrouille en  memory.
            Marshal.Copy(ImageAddress, ImageBuffer, 0, TotalPixels)
        End Sub
     
        Private Sub UnlockTheImage()
            ' ----- recopie le buffer d'entiers dans le image.
            Marshal.Copy(ImageBuffer, 0, ImageAddress, TotalPixels)
            ' ----- deverouille l'image en memoire.
            Image.UnlockBits(ImageData)
            ImageData = Nothing
            ReDim ImageBuffer(0)
        End Sub
        Public Sub BlendColor()
            Dim pixelIndex As Integer
            Dim onePixel As Integer
     
            Dim alpha As Integer
            Dim red As Integer
            Dim green As Integer
            Dim blue As Integer
     
            Dim y As Integer
            Dim x As Integer
     
            ' ----- Lock the image for speed.
            LockTheImage()
     
            For y = 0 To BaseImageHeight - 1
                For x = 0 To BaseImageWidth - 1
                    pixelIndex = y * BaseImageWidth + x
                    onePixel = ImageBuffer(pixelIndex)
     
                    ' ----- Extrait les composantes A,R,G,B.
                    alpha = (onePixel >> 24) And &HFF
                    red = (onePixel >> 16) And &HFF
                    green = (onePixel >> 8) And &HFF
                    blue = onePixel And &HFF
     
                    ' ----- TON EXEMPLE DE CALCUL TRADUIT.
                    'Case BlendMode.Ecran
                    ' R = Max(0, Min(255, 255 - (255 - col1.Color.R) * (255 - col2.Color.R) / 255))
                    ' G = Max(0, Min(255, 255 - (255 - col1.Color.G) * (255 - col2.Color.G) / 255))
                    ' B = Max(0, Min(255, 255 - (255 - col1.Color.B) * (255 - col2.Color.B) / 255))
                    'BlendColor = CColor.FromRGB(R, G, B)
     
                    red = Math.Max(0, Math.Min(255, 255 - (255 - red) * (255 - red) / 255))
                    green = Math.Max(0, Math.Min(255, 255 - (255 - green) * (255 - green) / 255))
                    blue = Math.Max(0, Math.Min(255, 255 - (255 - blue) * (255 - blue) / 255))
     
     
                    ' ----- met le pixel à la nouvelle color. 
                    ' ----- conserve le canal Alpha original .
                    ImageBuffer(pixelIndex) = (alpha << 24) + _
                       (red << 16) + (green << 8) + blue
                Next x
            Next y
     
            ' ----- Finished. Unlock the image.
            UnlockTheImage()
        End Sub
    End Class
    code .vb du Form User :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Public Class Form1
        Private myBmp As Bitmap
        Private thelock As LockBitmap
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            PictureBox1.Size = New Size(300, 300)
            PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
            PictureBox2.Size = New Size(300, 300)
            PictureBox2.SizeMode = PictureBoxSizeMode.AutoSize
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            myBmp = My.Resources.Mebarek
            myBmp = New Bitmap(myBmp, PictureBox1.Width, Height)
            PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
            PictureBox1.Image = myBmp
        End Sub
     
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            If myBmp Is Nothing Then Return
            thelock = New LockBitmap()
            thelock.Image = myBmp
            thelock.BlendColor()
     
            PictureBox2.Image = thelock.Image
     
        End Sub
     
     
    End Class
    bon code...

Discussions similaires

  1. [XL-2003] Comment sélectionner une "Sheet" autrement que par un nom
    Par Vadorblanc dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 17/10/2010, 18h30
  2. [Smarty] Deux images sans espace appelées par un foreach
    Par Shoam dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/01/2008, 14h12
  3. "Merger" deux images avec une couleur de transparence
    Par MaelstroeM dans le forum VB.NET
    Réponses: 7
    Dernier message: 14/09/2007, 09h34
  4. Comment affecter une image a un PictureBox par code?
    Par ayouss dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/07/2006, 08h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo