XL 2016 Webcam pour une photo type carte identité

fanch55

XLDnaute Barbatruc
Salut à tous, mais cela est dirigé vers PatrickToulon dont je suis pas mal de fils intéressants (partout) et dont je me suis inspiré pour cette source .
Je joint contrairement à mon habitude un fichier complet en XLSM ( gare aux autorisations, mais je le certifie sans malveillance aucune [ de ma part] ) .
Ce fichier effectue une capture photo à partir de la webcam ( ou un fichier image ) et le réduit/redimensionne au format carte identité ou tout au moins aux dimensions 3.5 cm x 4.5 cm .
La partie intéressante est de transformer la photo rognée en une image conforme au but, c'est à dire de ne pas conserver l'image originale trop volumineuse .
Le besoin est de pouvoir fournir une photo de faible dimension au format CI pour des licences de pétanques (entre autre)
Tout point d'amélioration est le bienvenue .
Pour ceux qui n'ont pas de webcam sur le poste fixe, j'ai testé avec Droidcam sur le smartphone et Droidcam Client sur Pc, c'est opérationnel (j'en suis bluffé).
 

Pièces jointes

  • Camera.xlsm
    107.9 KB · Affichages: 84

fanch55

XLDnaute Barbatruc
Salut Patrick,
J'ai testé ton code WIA par curiosité, effectivement il crope bien l'image (l'avantage c'est qu'il sauvegarde bien l'image aussitôt )
Cependant, je ne vois pas ce qu'il fait de plus que ce qui est fourni par excel :
VB:
Private Sub Cam_Load()
Dim Img As Object

    Me.Paste [Zone_Cliché]
    Set Img = Selection
    With Img
        .Name = Name_Photo
        .Height = Hci * 2
                        
        Set_Message _
            "Re-dimentionnez/Déplacez l'image du fond" & vbLf & _
            "Ne pas toucher aux poignées qui sont règlées pour le format Identité" & vbLf & _
            "Cliquez n'importe où en dehors de l'image pour procéder au découpage", _
            .Left, .Top + .Height, .Width
                  
        Application.CommandBars.ExecuteMso ("PictureCrop")
        With .ShapeRange.PictureFormat
            .Crop.ShapeHeight = Hci
            .Crop.ShapeWidth = Wci
            .Crop.ShapeLeft = Img.Left + ((.Crop.PictureWidth - Wci) / 2)
            .Crop.ShapeTop = Img.Top + ((.Crop.PictureHeight - Hci) / 2)
        End With

    End With
    
End Sub

D'autant plus que la fonction PictureCrop assure tout l'interactif du Découpage, alors qu'avec Wia, il va falloir développer tout ça ... ( à moins qu'il existe dans WIA, ce que je n'ai pas trouvé ... )

Ceci dit, je n'ai pas réussi à récupérer le Scale d'un shape Image, alors que je peux le définir ... Curieux !!!
Shaperange.scaleheight ....etc .. Pas vu dans les propriétés vba alors que c'est bien affiché dans les propriétés du Shape dans Excel .
 

patricktoulon

XLDnaute Barbatruc
bonsoir frach55 Staple1600

ben je l'ai "développé"
1 image un la redimensionnable ,le calcul des diff en pourcentage,application filtre crop WIA

demo3.gif
 

patricktoulon

XLDnaute Barbatruc
non je le donnerais quand j'aurais mis tout les options que je veux y mettre
crop
zoom
resize
modif qualité
etc...

je n'ai pas besoins de flatter mon ego ,il y a longtemps que je sais faire
perso j'utilise un outils que j'ai développé avec le module GDI+ de Arkham sur developpez.com
beaucoup beaucoup plus puissant ;)

la je l'ai fait pour m'amuser en fait pour tester mon raisonnement

franch55 quand j'arriverais a récupérer le code je reproduirais ton modèle sur 2007 pour tester
 

patricktoulon

XLDnaute Barbatruc
re
Ok l'interactif de cropping est donc développé, je suis curieux de voir le nombre de lignes de codes
en l’état le code et
il comprend la mise a l’échelle de l' image1 support visuel
la fabrication du calque redimensionnable+ événement poignée
calcul +affichage pourcentage textbox
et enfin WIA et son application


VB:
Option Explicit
Dim XX#, YY#

Function P_ToPx()
    With ActiveWindow.ActivePane
        P_ToPx = (.PointsToScreenPixelsY(Cells.Height) - .PointsToScreenPixelsY(0)) / Cells.Height
    End With
End Function

Function Img_pixel_to_point(pathImage)
    Dim Img As Object, IP As Object
    Set Img = CreateObject("WIA.ImageFile")    'Création conteneur pour l'image
    Img.LoadFile pathImage    'Chargement de l'image dans le conteneur WIA
    Img_pixel_to_point = Array(Img.Width / P_ToPx, Img.Height / P_ToPx)
End Function

Private Sub CommandButton2_Click()
    Dim filetoopen As Variant, ratio, sizeimg, coeff#
    ChDir "C:\Users\Public\Pictures\Sample Pictures"
    filetoopen = Application.GetOpenFilename("Jpeg Files (*.jpg), *.jpg", 1, "choisir une image")
    If filetoopen <> False Then
        chemin.Value = filetoopen
        Image1.Picture = LoadPicture(chemin.Value)
        sizeimg = Img_pixel_to_point(chemin.Value)
        ratio = sizeimg(0) / sizeimg(1)
        Image1.Width = sizeimg(0) / (sizeimg(0) / fond.Width)
        Image1.Height = Image1.Width / ratio
        If Image1.Height > fond.Height Then
            coeff = Image1.Height / fond.Height
            Image1.Height = Image1.Height / coeff
            Image1.Width = Image1.Width / coeff
        End If
    End If
    Image1.PictureSizeMode = 1
End Sub

Private Sub CommandButton3_Click()
    Dim fname As Variant, imgOut
    Dim Img As Object, IP As Object
    imgOut = Application.GetSaveAsFilename(InitialFileName:=Environ("userprofile") & "\DeskTop", filefilter:="image Files (*.jpg), *.jpg", Title:="ENREGISTREMENT DE LA CAPTURE")
    If imgOut <> False Then
        Set Img = CreateObject("WIA.ImageFile")
        Set IP = CreateObject("WIA.ImageProcess")
        Img.LoadFile chemin.Value

        'on crops maintenant
        'Ajoute le filtre pour redimensionner l'image (Scale)
        IP.Filters.Add IP.FilterInfos("Crop").FilterID
        IP.Filters(1).Properties("Left") = (Img.Width / 100) * Val(cropleft)
        'definit la position à partir du bord supérieur pour la coupe
        IP.Filters(1).Properties("Top") = (Img.Height / 100) * Val(croptop)
        'definit la position à partir du bord droit pour la coupe
        IP.Filters(1).Properties("Right") = (Img.Width / 100) * Val(cropright)
        'definit la position à partir du bord inférieur pour la coupe
        IP.Filters(1).Properties("Bottom") = (Img.Height / 100) * Val(cropbottom)

        '----------------------------------------------------
        'etape finale
        'Application du filtre à l'image
        Set Img = IP.Apply(Img)
        'Enregistre l'image redimensionnée
        If Dir(imgOut) <> "" Then Kill imgOut
        Img.SaveFile imgOut
        Image1.PictureSizeMode = 0
        Image1.Picture = LoadPicture(imgOut)
        cropsbutton_Click
    End If
End Sub

'*******************************************************************************************
'enclenche le movable de Cpr et cache les poignées de redimentionnement
Private Sub Cpr_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    XX = X: YY = Y
End Sub
'deplace le Cpr
Private Sub Cpr_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 1 Then
        CpR.Move CpR.Left + (X - XX), CpR.Top + (Y - YY)
        attachpoignée
        calculCroppercent
    End If
End Sub
'arrete le movable du Cpr
Private Sub attachpoignée()
    HG.Move CpR.Left - HG.Width, CpR.Top - HG.Height
    HD.Move CpR.Left + CpR.Width, CpR.Top - HG.Height
    BG.Move CpR.Left - BG.Width, CpR.Top + CpR.Height
    BD.Move CpR.Left + CpR.Width, CpR.Top + CpR.Height
End Sub



Private Sub cropsbutton_Click()
    Dim Controle, elem
    Controle = Array(CpR, HG, HD, BG, BD)
    For Each elem In Controle: elem.Visible = Not elem.Visible: Next
    CpR.Move Image1.Left, Image1.Top
    attachpoignée
End Sub

Private Sub HG_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    rollcrops Button, X, Y, Array(HG, BG, HD)
End Sub

Private Sub HD_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    rollcrops Button, X, Y, Array(HD, BD, HG)
End Sub

Private Sub BG_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    rollcrops Button, X, Y, Array(BG, HG, BD)
End Sub

Private Sub BD_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    rollcrops Button, X, Y, Array(BD, HD, BG)
End Sub

Sub rollcrops(B, X, Y, Poignées)
    If B = 1 Then
        If BG.Top - HG.Top < 15 Or HD.Left - HG.Left < 15 Then Exit Sub Else HG.Left = HG.Left
        Poignées(0).Move Poignées(0).Left + (X - 3), Poignées(0).Top + (Y - 3)
        Poignées(1).Left = Poignées(0).Left: Poignées(2).Top = Poignées(0).Top

        If (BG.Top - HG.Top) > 15 And (HD.Left - HG.Left) > 15 Then
            CpR.Move HG.Left + HG.Width, HG.Top + HG.Height, HD.Left - (HG.Left + HG.Width), BG.Top - (HG.Top + HG.Height)
        Else
            HG.Left = HG.Left - 1: HD.Left = HD.Left + 2: BG.Top = BG.Top + 2: HG.Top = HG.Top - 1
            attachpoignée
        End If
    End If
    calculCroppercent
End Sub

Sub calculCroppercent()
    cropleft = (CpR.Left - Image1.Left) * 100 / Image1.Width & " %"
    cropright = 100 - ((CpR.Width + CpR.Left - Image1.Left) * 100 / Image1.Width) & " %"
    croptop = (CpR.Top - Image1.Top) * 100 / Image1.Height & " %"
    cropbottom = 100 - ((CpR.Height + CpR.Top - Image1.Top) * 100 / Image1.Height) & " %"
End Sub

voila quand je regarde le code qu'il t'a fallu dans la feuille + le module ,et je parle même pas du userform
je me dis que pour quelque chose que soit disant excel fait nativement ............

alors que mon modèle dont même les outils sont créé de toute pièce

ben.....je dirais que je n'ai pas trop a me plaindre hein LOL:D

et encore ça n'est qu'une version qui sort de l'oeuf

j'èpère avoir satisfait ta curiosité ;)

j'ajouterais que je suis sur qu'il n'y aura pas de soucis de compatibilité avec les versions superieures ;)
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Testé et fait fonctionné ton code .
Remarques:
  • ne fonctionne que sur un Userform (activex.move ....)
  • Nécessite de nombreux Activex
  • C'est le crops variable qu'on ajuste à l'image fixe, alors que mon code fait l'inverse, le Crops est fixé à une taille de 3.5cm x 4.5cm et c'est l'image qu'on case dedans .
Je ne suis pas sûr que ton code soit plus réduit que le mien ...

Mais j'applaudis le résultat et les efforts que tu as fait en quatrième vitesse,
attention à la sauvegarde qui se plante car tu essaies de faire des calculs à partir d'une valeur exprimée en pourcentage littéral.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour franch55
si si j'ai moins de code que toi j'ai compté les lignes ;)

des activX ben oui on est dans un userform
bon maintenant j'en ai plus j'ai ajouté le zoom jusqu'a 600 fois pour pouvoir chopper des petits détails
demo3.gif

par contre je me pose une question
j'ai regardé un peu le crop sur 2007 et a la main a part pour l'enregistrement on peut faire sans code
 

patricktoulon

XLDnaute Barbatruc
bon j'ai réussi a copier tout dans un nouveau fichier avec tes codes feuilles et module pas le userform j'en ai pas besoins

deja je n'ai plus l'erreur irrémédiable c'est deja une bonne chose et ce qui prouve bien qu'il y a un composant qui n'est pas compatible excel2007

mais!!
des que je choisi une image j'ai une erreur "ne gere pas la propriété"
Capture.JPG

le message d'erreur
Capture2.JPG
 

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 112
dernier inscrit
cuq-laet