Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Candidat au titre de Membre du Club
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2012
    Messages : 22
    Points : 12
    Points
    12

    Par défaut Dessiner sur une image

    Bonjour,

    J'ai besoin de faire des annotations sur des images de mon formulaire. Les images sont des photos faites par l'utilisateur.

    J'ai pensé à mettre un champ "image manuscrite" avec une image de fond. Mais on ne peut le faire qu'en mode création et ce n'est pas le but.

    Du coup j'envisage 2 possibilités :
    Option 1 :
    Créer un champ image et un champ image manuscrite.
    et quand on clique sur un bouton cela met le contenu du champ image dans le champ image manuscrite. Après quoi l'utilisateur pourrait écrire sur l'image.
    J'ai essayé : ça ne marche pas. Les 2 images sont stockées en base64 mais pas de la même manière semble t-il.

    Option 2 plus compliquée:
    mettre un bouton avec du code c# et un champ image. quand on clique sur le bouton on ouvre une nouvelle fenêtre : un éditeur d'image. On y modifie l'image. Et quand on valide on colle l'image dans le champ image du formulaire.
    Cela demande un éditeur d'image capable d’interpréter l'image dans son format.

    Si vous avez une solution qui marche je prends!
    Pour l'option 1 pensez vous qu'il soit possible (avec un peu de code) de traduire l'image pour qu'elle soit lisible dans le champ image manuscrite?

  2. #2
    Membre Expert Avatar de billout rm
    MVP InfoPath
    Inscrit en
    juillet 2007
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations professionnelles :
    Activité : MVP InfoPath

    Informations forums :
    Inscription : juillet 2007
    Messages : 772
    Points : 1 023
    Points
    1 023

    Par défaut

    Bonjour,
    En effet, InfoPath permet d'ajouter une image de fond uniquement en mode création sur un control de type "Ink".

    Ce qui signifie que techniquement, nous ne pouvons pas avoir le cas ou l'utilisateur télécharge une photo puis réaliser des annotations dessus...
    Cela doit être assez compliqué à gérer au niveau de la superposition des images!
    La seule solution serait que l'utilisateur réaliser les modifications dans Paint par exemple avant de télécharger l'image dans le formulaire.

    Je vous avouerai que je n'ai pas d'idée sur ce coup là... Mais je suis preneur si vous avez une solution.
    Rémi MATAYRON
    MVP InfoPath
    N'hésitez pas à visiter mon blog dédié à InfoPath et SharePoint : http://rmatayron.blogspot.com/

    Pour plus de visibilité sur le forum, marquer la question en [Résolu] lorsque la réponse fournie vous convient.

  3. #3
    Candidat au titre de Membre du Club
    Homme Profil pro
    Developpeur Consultant
    Inscrit en
    mars 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2012
    Messages : 22
    Points : 12
    Points
    12

    Par défaut

    Je me suis re-penché sur le problème, voici la solution que j'ai retenue:

    Pour modifier une image l'utilisateur clique sur un bouton
    Je récupére l'image du formulaire dans un string
    je traduit ce string de base64 vers binaire
    j'enregistre cette image temporaire sur le disque avec une extension perso
    sur le PC surlequel le formulaire doit fonctionner je met "paint" par défaut pour cette extension
    j'ouvre l'image (avec paint)
    L'utilisateur fait ses modifs sout paint puis enregistre
    j'attends 2 minutes (ou moins si l utilisateur ferme paint avant)
    puis je récupère l'image temporaire
    je la retraduit en base64
    et je la met dans le formulaire

    si l'utilisateur dépasse le délai, paint se ferme sans enregistrer et on revient au formulaire.

    C'est clairement améliorable, mais ça à le mérite de fonctionner!

    Code :
    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
    using Microsoft.Office.InfoPath;
    using System;
    using System.Windows.Forms;
    using System.Xml;
    using System.Xml.XPath;
    using mshtml;
    using System.Collections;
    using System.Xml.Xsl;
    using System.Diagnostics;
    using System.IO;
    using System.Drawing;
     
           public void CTRL568_5_Clicked(object sender, ClickedEventArgs e)'code pour retoucher l'image
            {
                try
                {
                    'verifier image non vide																	-ok
                    XPathNavigator nav = e.Source.CreateNavigator();
                    string s = nav.SelectSingleNode(@"my:champ109", NamespaceManager).Value;
                    if (s != "")
                    {
                        'enregistrer l'image dans un fichier temp: c:\GBV\temp.tom								-voir C:\Bureau Bis\Divers\surcharger image
                        byte[] image = Convert.FromBase64String(s);
                        MemoryStream memStr = new MemoryStream();
                        memStr.Write(image, 0, image.Length);
                        Image img = Image.FromStream(memStr);
                        img.Save(@"c:\GBV\temp.tom");			
                        'faire un processus qui ouvre temp.tom	
                        'sur le PC mettre paint pour ouvrir les fichier.tom
                        Process myProcess = new Process();
                        myProcess.StartInfo.FileName = @"c:\GBV\temp.tom";
                        myProcess.Start();
     
                        'limite de temps pour modifier l'image 2 minutes
                        bool completed = myProcess.WaitForExit(120000);
     
     
                        if (!completed)
                        {
                            ' Temps d'attente dépassé : on tue le processus
                            if (!myProcess.HasExited)
                                myProcess.Kill();
                            MessageBox.Show("limite de temps pour modifier l'image depassé (2 minutes)", " ", MessageBoxButtons.OK);
     
                        }
                        else
                        {
                        'quant l'utilisateur sort en enregistrant, je reconvertit en base64, puis j'insére l'image dans le formulaire
                            string resultatBase64 = "";
     
     
                            'convertir temp.tom en base64
                            string inputFileName = @"c:\GBV\temp.tom";
                            System.IO.FileStream inFile;
                            byte[] binaryData;
     
                            inFile = new System.IO.FileStream(inputFileName,
                                                      System.IO.FileMode.Open,
                                                      System.IO.FileAccess.Read);
                            binaryData = new Byte[inFile.Length];
                            long bytesRead = inFile.Read(binaryData, 0,
                                                 (int)inFile.Length);
                            inFile.Close();
                            resultatBase64 = System.Convert.ToBase64String(binaryData,
                                                         0,
                                                         binaryData.Length);
                            nav.SelectSingleNode(@"my:champ109", NamespaceManager).SetValue(resultatBase64);
                        }
     
                    }
                }
                catch { }
            }

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •