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 6 et antérieur Discussion :

Transformer une image en Noir et Blanc


Sujet :

VB 6 et antérieur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Transformer une image en Noir et Blanc
    Bonjour,

    J'aimerai savoir comment transformer une image à l'origine en niveau de gris ou sépia en une image noir et blanc (chaque pixel est soit noir, soit blanc, mais pas gris).

    Je pense qu'il faut pour chaque pixel regarder sa couleur si elle est en dessus ou en dessous d'un certain seuil (lequel?), on attribue sa nouvelle couleur noire ou blanche.
    Mais je ne sais pas comment faire, pourriez vous m'aider?

    Merci d'avance

    PS : Je suis avec VB5

  2. #2
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Bonjour,
    tu ne précises pas quel(s) format(s) d'image, et il va falloir pouvoir décoder le ou les format(s) nécessaire(s). Tu as vraiment besoin de faire ça en VB ? Tu as des logiciels de retouche d'image qui font ça très bien non ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta rapidité.

    Malheureusement, je suis obligé de faire ça en VB, car ce ne sera qu'une étape du programme.

    Le format d'image est en .jpg . Je pense l'ouvrir dans une PictureBox.

  4. #4
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    En cherchant un peu sur le Net, j'ai trouvé ce projet zippé que j'ai testé et qui fonctionne. Par défaut, il te demande un fichier BMP mais tu peux très bien ouvrir un fichier JPG avec.

  5. #5
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 105
    Points : 16 627
    Points
    16 627
    Par défaut
    Pour OhMonBato, trés jolie ton nouvel avatar.

    benjgreen
    Pas vraiment une transformation en noir et blanc, mais proche du résultat, rechercher les contours et les afficher en noir et blanc, peut-être un complément de tes besoins.
    Tiré d’un programme qui passe d’une image x nombre de couleur vers une matrice contours pour alimenter un panneau matriciel à leds (rouges), j’ai essayé de ne laisser que la partie recherche de contours et prés affichage.
    Possibilité de modifier la tolérance de conversion en noir (led allumée) sur font blanc (led éteinte dans le programme de base).

    Sur un Form, 2 PictureBoxs, 1 Label, 1 HScrollBar.
    Mettre une image dans Picture1 (pas trop grosse en nombre de pixels, 1/4 d'écran pour les premiers essais.)
    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    Option Explicit
    Private Type BITMAP
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
    End Type
    Private Type Pixel
        Red As Byte
        Green As Byte
        Blue As Byte
    End Type
     
    Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" ( _
        ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
    Private Declare Function GetBitmapBits Lib "gdi32" ( _
        ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
    Private Declare Function SetBitmapBits Lib "gdi32" ( _
        ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
     
    Dim BitsPict() As Byte
    Dim MatricePict() As Pixel
    Public Size As Long
    Dim I As Integer, J As Integer
    Dim Z As Long
    Dim ToleranceNoir As Byte
     
    Private Sub Form_Load()
    Me.ScaleMode = vbPixels
     
    Label1.AutoSize = True
    Label1.Alignment = 2
    Label1.Move 86, 2
    Label1.Caption = 100
     
    HScroll1.Min = 0
    HScroll1.Max = 200
    HScroll1.Value = 100
    HScroll1.Move 9, 21, 175, 19
     
    Picture1.ScaleMode = vbPixels
    Picture1.AutoRedraw = True
    Picture1.Appearance = 0
    Picture1.AutoSize = True
    Picture1.Move 6, 48
     
    Picture2.ScaleMode = vbPixels
    Picture2.AutoRedraw = True
    Picture2.Appearance = 0
    Picture2.Move 30, 78
     
    ToleranceNoir = HScroll1.Value
    ImageVersMatrice Picture1
    MatriceVersImage Picture2
    End Sub
    Private Sub HScroll1_Change()
    If Me.Visible = False Then Exit Sub
    ToleranceNoir = HScroll1.Value
    Label1.Caption = ToleranceNoir
    MatriceVersImage Picture2
    End Sub
    Private Sub HScroll1_Scroll()
    HScroll1_Change
    End Sub
    Private Sub Picture1_Click()
    Picture1.ZOrder
    End Sub
    Private Sub Picture2_Click()
    Picture2.ZOrder
    End Sub
     
    Private Sub ImageVersMatrice(Picture As PictureBox) '
    'Copie de l'image vers une matrice
    Dim InfoPict As BITMAP
     
    GetObject Picture.Image, Len(InfoPict), InfoPict
     
    Size = InfoPict.bmWidth * InfoPict.bmBitsPixel * InfoPict.bmHeight / 8
    ReDim BitsPict(Size) As Byte
    ReDim MatricePict(InfoPict.bmHeight, InfoPict.bmWidth) ' As Pixel
     
    GetBitmapBits Picture.Image, Size, BitsPict(1)
    Dim K As Long, D As Long
    K = InfoPict.bmWidth * 4
    For I = 1 To InfoPict.bmHeight
     D = ((I - 1) * K) + 1
     For J = 1 To InfoPict.bmWidth
      Z = D + ((J - 1) * 4)
      MatricePict(I, J).Blue = BitsPict(Z)
      MatricePict(I, J).Green = BitsPict(Z + 1)
      MatricePict(I, J).Red = BitsPict(Z + 2)
     Next J
    Next I
     
    Picture2.Height = InfoPict.bmHeight + 2: Picture2.Width = InfoPict.bmWidth + 2
    End Sub
    Private Sub MatriceVersImage(Picture As PictureBox)
    'Copie de la matrice vers picture contours noir
    ReDim BitsPict(UBound(MatricePict(), 1) * UBound(MatricePict(), 2) * 4)
    Z = 0
    For I = 1 To UBound(MatricePict(), 1)
     For J = 1 To UBound(MatricePict(), 2)
      Z = Z + 1: DoEvents
      If MatricePict(I, J).Red < ToleranceNoir And _
        MatricePict(I, J).Green < ToleranceNoir And _
        MatricePict(I, J).Blue < ToleranceNoir Then
       BitsPict(Z + 2) = 0: BitsPict(Z + 1) = 0: BitsPict(Z) = 0
       Else
       BitsPict(Z + 2) = 255: BitsPict(Z + 1) = 255: BitsPict(Z) = 255
      End If
      Z = Z + 3
      DoEvents
     Next J
     DoEvents
    Next I
    Picture.Cls
    SetBitmapBits Picture.Image, UBound(BitsPict), BitsPict(1)
    Picture.Refresh
    End Sub

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci OhMonBato pour tes réponses.

    Etant novice en VB, je ne comprends pas tout le programme.
    Pourrais tu mettre des commentaire pour comprendre?

    Ce que j'aimerais obtenir en réalité, c'est à partir d'une image comme celle ci ( http://ikastor.free.fr/media/qr_ikastor_blogspot_com_01 ) en niveau de gris, obtenir une matrice dans laquelle chaque gros pixel de la photo vaut 1 s'il est blanc(ou gris clair) et 0 s'il est noir (ou gris foncé).

    Merci d'avance

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    salut

    - s'il s'agit de travailler pixel par pixel, les fonctions natives de VB6 permettent à un débutant de s'en sortir sans les fonctions de l'API de windows
    - si par contre on va vers un "second degré" de développement, à l'aide de l'Api de Windows, il ne faut alors pas travailler pixel par pixel, dans une double boucle, mais à l'aide d'un tableau (DIBbits)
    - dans tous les cas de figure, il nous a été précisé que l'image à transformer était en niveaux de gris. Les 3 composantes d'un tel niveau étant égales, il suffit de ne calculer que la valeur de la plus facile des 3 (les 2 autres ont forcément la même valeur, s'agissant d'un niveau de gris !). Le reste est simple : si > 128 ===>> blanc, sinon ===>> noir
    Voilà les bases à suivre. Le reste à la charge, du demandeur (maintenant suffisamment guidé pour commencer à développer, il me semble ...).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Dans le cas de la relecture de codes 3D de type datamatrix, je pense que seul les carrés noirs sont important, tout le reste doit être considéré comme du blanc.
    De plus ce qui est considéré comme un pixel du code représentera sur l'image un carré noir de 5px par 5 ou de 10 par 10.
    Si tu dois redécoder le contenu ensuite, bon courage....

  9. #9
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Pour résoudre ton problème, je partirais des constatations suivantes :
    Ton QR code fait 31 points x 31 points mais il est représenté par une image de 248 pixels x 248 pixels.
    Si on part du principe que ton programme sera fait pour des QR code de 31 x 31 uniquement, tu lis l'image d'origine que tu affiches dans un controle picture. Tu y lis la taille en pixels (248 par exemple dans ton exemple mais tu peux le trouver par code), on en conclue donc que chaque point de ton QR code est constituté par un carré de 8 pixels x 8 pixels (248 / 31).
    Si on lit ton QR code, il suffit de lire tous les 8 pixels, par colonne ou par ligne, la couleur d'origine, de la comparer à ce qui sera le seuil entre noir et blanc (perso j'ai pris &H808080) et d'affecter à tous les pixels constituant le point en cours la couleur noir ou blanc. On en profite pour mémoriser dans un tableau la couleur du point du QR code.
    Quelques dizaines de ligne de code suffisent (avec des remarques j'arrive à une cinquantaine de lignes). A toi de jouer

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci à vous pour votre aide,

    Cependant, mon problème n'est pas encore résolu :
    Le code que je dois décrypter fait en réalité 49x49 (mais cela ne change rien). Par contre, les marges sur les cotés, en haut et en bas ne sont pas toujours les mêmes (ou égales à un pixel du code).
    Après, une chose qui doit être simple mais que je ne connais pas, c'est d'extraire la couleur (ou le niveau de rouge par exemple).
    Ensuite, pour le décodage de la matrice, ca je l'ai déjà programmé.

    Merci encore!

  11. #11
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Après, une chose qui doit être simple mais que je ne connais pas, c'est d'extraire la couleur (ou le niveau de rouge par exemple).
    Tu l'as dit, c'est simple, surtout avec le code qu'on t'a donné, donc maintenant, tu cherches un peu et tu reviendras si c'est pour un problème de code précis.

  12. #12
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonsoir à tous,

    Je dois effectuer à peu près le même programme que le décodage du QRM code, les réponses que vous avez posté sont très intéressante cependant je n'arrive pas à lire le fichier zip. Y aurait-il un moyen de l'avoir sous une autre forme s'il vous plait, c'est vraiment très important. je vous remercie d'avance.

  13. #13
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci INFINIMENT vous me sauvez la vie. Par contre ici il y a plusieurs liens est ce que js'il vous plait vous pouvez me dire a quoi correspond chacun d'entre eux et n'y a t il pas moyen d'avoir des commentaires avec le bout de code principal histoire de savoir concrêtement ce que ça fait. Je vous remerci beaucoup d'avance.

  15. #15
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonsoir ou bonjour

    Le premier lien est le Read-me de l'auteur
    Les quatres autres sont le projet pour voir le code tu télécharge les quatre et tu ouvre le dernier

    Je ne peux pas te montrer la forme de la form mais je peux te quoter le code si cela te convient tu peux toujours télécharger le projet.

    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
     
    Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
     
    Private Const SRCCOPY = &HCC0020
     
    Private Sub CmdLoad_Click()
        On Error GoTo ErrorHandler
        CD1.ShowOpen
        PicBW.Picture = LoadPicture(CD1.FileName)
    ErrorHandler:
    End Sub
     
    Private Sub CmdDither_Click()
        PicBW.Cls
        GradInt = (PicDither.Width / 15) / 11
        For v = 0 To PicBW.Height / 15 - 1
            For h = 0 To PicBW.Width / 15 - 1
                CurRGB = (RGBCon(GetPixel(PicBW.hdc, h, v), 1) + RGBCon(GetPixel(PicBW.hdc, h, v), 2) + RGBCon(GetPixel(PicBW.hdc, h, v), 3)) / 3
                PalLoc = 0
                Do Until GradInt * PalLoc > (CurRGB / 255) * (PicDither.Width / 15)
                    PalLoc = PalLoc + 1
                Loop
                PalLoc = PalLoc - 2
                Sclh = h
                Sclv = v
                If h > 15 Then Sclh = h Mod 16
                If v > 15 Then Sclv = v Mod 16
                SetPixel PicBW.hdc, h, v, GetPixel(PicDither.hdc, GradInt * PalLoc + Sclh, Sclv)
            Next h
            PicBW.Refresh
            LblProg.Caption = Format(100 * (v + h / (PicBW.Width / 15 - 1)) / (PicBW.Height / 15 - 1), "0.00") & "%"
            LblProg.Refresh
        Next v
    End Sub
     
    Private Function RGBCon(RGBColor, CType As Integer)
        'Convert RGB integer to R (CType = 1), G (CType = 2), or B (CType = 3) integer
        If CType = 1 Then
            CType = 3
        ElseIf CType = 3 Then
            CType = 1
        End If
        HRGB = Left("000000", 6 - Len(Hex(RGBColor))) & Hex(RGBColor)
        RGBCon = Val("&H" & Mid(HRGB, 1 + 2 * (CType - 1), 2))
    End Function
     
    Private Sub CmdSave_Click()
        SavePicture PicBW.Image, App.Path & "\Temp.bmp"
        MsgBox "Saved to: " & App.Path & "\Temp.bmp", , "Saved"
    End Sub
    Si les posts te conviennent pense a les noter en bas a droite du post sur le petit pouce

  16. #16
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Citation Envoyé par nadaige89 Voir le message
    Bonsoir à tous,

    Je dois effectuer à peu près le même programme que le décodage du QRM code, les réponses que vous avez posté sont très intéressante cependant je n'arrive pas à lire le fichier zip. Y aurait-il un moyen de l'avoir sous une autre forme s'il vous plait, c'est vraiment très important. je vous remercie d'avance.
    Comment est-ce possible de ne pas pouvoir lire un fichier zip ? Ce format est reconnu sous windows sans aucun outil supplémentaire.

Discussions similaires

  1. Vectoriser une image bitmap noir ou blanc
    Par yann458 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/10/2011, 13h34
  2. [VB6] passer une image en noir et blanc
    Par nadaige89 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/12/2010, 21h23
  3. [Filtre]Convertir une image en noir et blanc
    Par Bourak dans le forum Graphisme
    Réponses: 13
    Dernier message: 08/03/2010, 16h27
  4. [Galerie] Fonction pour convertir une image en noir et blanc
    Par piotrr dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/02/2009, 12h23

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