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

ASP.NET Discussion :

Manipuler des fichiers images avec du .NET


Sujet :

ASP.NET

  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Manipuler des fichiers images avec du .NET
    Salut tout le monde.

    On voit pas mal de site (surtout de rencontre) qui manipulent les photos que l'on poste. Ils rajoute un filigranne sur la photo, genre le nom du site en travers ou en bas de la photo, visiblement sans intervention humaine (ou alors le gars est super fort ! ! ! ).

    Les sites que j'ai vu sont essentiellement programmé en PHP. ALors je me pose la quesiton : .NET permets il cela ? Vu que la réponse va être oui, avec des grandes chances, je pose la question d'aprés :

    Comment on fait ?

  2. #2
    Membre éprouvé

    Homme Profil pro
    kiné passionné de dev
    Inscrit en
    Mars 2006
    Messages
    1 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : kiné passionné de dev

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 570
    Billets dans le blog
    1
    Par défaut
    Pense à utiliser la fonction recherche (danns developpez ou )

    http://www.developpez.net/forums/d40...ne-gif-animes/

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Jette un oeil aux classes System.Drawing.Image et System.Drawing.Graphics

    C'est à peu près tout ce dont tu auras besoin

    Tu peux ouvrir un fichier image de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim img As Image = Image.FromFile("uneImage.jpg")
    Ensuite tu crées un Graphics pour la manipuler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim g As Graphics = Graphics.FromImage(img)
    Tu dessines ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g.FillEllipse(Brushes.Green, x1, y1, x2, y2)
    g.DrawString("Hello", New Font("Arial", 12), Brushes.Black, x, y)
    ...
    Et tu enregistres l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    img.Save("uneImage_modifiée.jpg")

  4. #4
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Poulain pour ta remarque pertinente.
    Depuis le temps que tu me croise ici, tu doutes encore du fait que je fasse cette action simple et préalable à tous mes topics ?
    Presque, si on était pas Lundi matin et que j'avais pas passé un super Week-end, je serais vexé !

    Maintenant, je t'invite à cliquer sur le lien du topic, comme je l'ai fait et partir du principe que si c'est écrit en Anglais, c'est à peu prés aussi compréhensible que le Vulcanien ou le Centauri pour moi. Encore que, je parle mieux le Centauri. Mais en plus, dans la page qui s'ouvre y a même pas de référence à la manipualtion des images.

    tomlev, je teste ta contribution dans l'aprés midi et je reveins soit avec des questions subsidiaires, soit pour les remerciements et la cloture du topic.

  5. #5
    Membre éprouvé

    Homme Profil pro
    kiné passionné de dev
    Inscrit en
    Mars 2006
    Messages
    1 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : kiné passionné de dev

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 570
    Billets dans le blog
    1
    Par défaut
    Le fait que ce soit en anglais ne devrait pas être une barrière en informatique, sinon concernant le lien, il a en effet été modifié en http://labs.insert-title.com/Quick-W...rticle832.aspx , mais c'était pas compliqué à retrouver.

    Amuse toi bien

  6. #6
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Aprés une petite semaine de crève, me revoilou.

    Donc j'ai essayé vos deux méthodes, somme tout assez similaire

    Avec celle de Tomlev j'ai une erreur que je n'arrive à pas a détecter : "une erreur c'est produite dans GDI+"

    Avec celle de Poulain, y a pas d'erreur, mais y a pas de filigrane non plus !
    J'ai fait des modifications, bien sûr, et peut être que cela vient de là. Je vous soumet mon code :
    Dans une classe externe :
    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
     
    Imports Microsoft.VisualBasic
    Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports System.Drawing.Drawing2D
    Imports System.IO
     
    Namespace ProjetY
     
        Public Class TraitementImage
     
            Public Shared Sub AjoutFiligrane(ByRef img As Image)
                Dim Width, Height, shadowSize As Integer
                Dim Bitmap As System.Drawing.Bitmap
                Dim ImgFormat As ImageFormat
                Dim baseMap As Bitmap
                Dim top, left As Integer
     
                Dim letterBrush As SolidBrush = New SolidBrush(Color.FromArgb(50, 255, 255, 255))
                Dim shadowBrush As SolidBrush = New SolidBrush(Color.FromArgb(50, 0, 0, 0))
                Dim fontTitle As Font = New Font("tahoma", 20, FontStyle.Bold)
                ImgFormat = ImageFormat.Jpeg : HttpContext.Current.Response.ContentType = "image/jpeg"  ' Default=jpeg '
                Width = img.Width
                Height = img.Height
                baseMap = New Bitmap(Width, Height)
                Dim myGraphic As Graphics = Graphics.FromImage(baseMap)
                With myGraphic
                    .DrawImage(img, 0, 0, Width, Height)
                    .SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
                    .DrawString("LABS.INSERT-TITLE.COM", fontTitle, shadowBrush, 5, 60)
                    .DrawString("LABS.INSERT-TITLE.COM", fontTitle, letterBrush, 7, 62)
                End With
                'img.Dispose()
     
            End Sub
     
        End Class
    End Namespace
    et dans le CodeBehind de mon composant qui gère les photos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fullSizeImg = Image.FromFile(NomCheminPhoto)
    ProjetY.TraitementImage.AjoutFiligrane(fullSizeImg)
    Ayant bien sûr fait un Imports de System.Drawing en haut du composant.
    La variable NomCheminPhoto contient le chemin complet, calculé en amont et fonctionne trés correctement puisque le fichier se retrouve bien sur le dsique du serveur.

    Enfin, sur l'anglais : c'est un débat que j'ai déjà eu il y a deux ans avec LuteceFalco et sur lequel j'ai évolué, un peu. Je fais partie de ces informaticien (car le mot a encore une sens pour moi) qiu sont tombé dedans étant petit. Le premier ordinateur que j'ai vu et utilisé j'avais 11 ans, en 6° en 1981. La vie, grâce à sa magie, m'a fais sortir de l'école en 3°, du coup, l'Anglais, zwip....

    Et maintenant, j'ai cravaché, j'ai un nieau d'ingénieur, mais toujours pas d'anglais. Mais je dis que, vu que je ne travaille qu'en Franc eet qu'avec des Français, plus ou moins francophone (vu comment certains s'expriment à l'oral et à l'écrit, parfois j'en doute....) pourquoi est ce que je pèterais les neurones à inculquer une langue qui n'est pas la mienne.
    Certains sont doué naturellment pour les langues, moi j'y arrive pas. Exemple qiu n'a rien à voir : le Breton ! Pourtant j'aime la Bretagne, vraiment, mais le Breton, ça fais quatre ans que j'essaie et je parle toujours pas, ça ne rentre pas.

    Donc, non, l'anglais n'ai pas naturel chez les informaticiens. L'anglais c'est une barrière chez les gens qui ne le parle pas, tout simplement.

    Voilà, on referme cette paranthèse.

    Merci à vous.

  7. #7
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Aprés queqlues tribulations, j'ai fini par découvrir un truc qui ne me convient pas dans la méthode de WaterMark (Poulain) : en fait, c'est un truc dynamique. Du coup, le fichier image n'est pas modifié et donc lorsqu'un internaute fera un "enregistré sous" de l'image, il aura l'originale.

    Le but est bien de "graver" un truc dans le fichier image.

    Du coup, tomlev, je crois que ta solution est la bonne voie, mais j'ai toujours cette erreur générique et j'arrive pas à la tracer plus que ça.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Avec celle de Tomlev j'ai une erreur que je n'arrive à pas a détecter : "une erreur c'est produite dans GDI+"
    Je suppose que tu essaies d'enregistrer dans le même fichier à partir duquel tu charges l'image ? Essaie en enregistrant dans dans un autre fichier. C'est un problème lié à Image.FromFile : ça garde le lien entre l'image et le fichier, et le fichier reste ouvert jusqu'à ce qu'on appelle Dispose sur l'image (donc pas possible d'enregistrer sur le fichier source).

    Si tu as besoin d'enregistrer sous le même nom, voilà une autre méthode pour ouvrir l'image sans bloquer le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim img As Image = Nothing
    Using str As Stream = File.OpenRead("uneImage.jpg")
        img = Image.FromStream(str)
    End Using
    ...
    Avec cette technique, on referme le fichier après avoir chargé l'image (Stream.Dispose est appelé à la fin du bloc Using), donc ça devrait régler le problème

  9. #9
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Tomlev

    Bon, j'essai tout ça dés que j'ai remis de l'ordre dans mon composant parce que, en codant les test pour mettre un filigranne, ben je me suis aperçu que je gérais pas trés bien certains trucs. Bref, je me remets une couche de boulot tout seul ! !

    Euh, précision : pour faire le Stream, faut bien que le fichier soit arrivé sur le disque ? Parce que j'ai FileUpload pour gérer ça en amont. J'ai pas mal ramé pour faire les tests, genre taille du fichier, taille de l'image. Et j'ai l'impression que c'est le FileUpload qui ne lâche pas le fichier pour l'enregistrement.

    Sinon, une question parallèle et double :
    - comment je peux faire pour mettre le filigranne texte en diagonale ? J'ai rien trouvé qui me permette de le faire.
    - le double de la question, parce que je pense que ça doit pas être possible et qu'il faut passer par un "dessin". Du coup, comment je peux ouvrir mon image et lui "coller" un gif devant ? Pareil, j'ai cherche à lier un Graphics à un gif, amis je trouve pas les commandes qui pourraient me permettre de faire ça.

    Kenavo

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Euh, précision : pour faire le Stream, faut bien que le fichier soit arrivé sur le disque ? Parce que j'ai FileUpload pour gérer ça en amont. J'ai pas mal ramé pour faire les tests, genre taille du fichier, taille de l'image. Et j'ai l'impression que c'est le FileUpload qui ne lâche pas le fichier pour l'enregistrement.
    Pas besoin du fichier, tu peux utiliser directement le Stream renvoyé par FileUpload.FileContent (à la place du FileStream)

    Citation Envoyé par zooffy Voir le message
    - comment je peux faire pour mettre le filigranne texte en diagonale ? J'ai rien trouvé qui me permette de le faire.
    Tu peux utiliser la méthode RotateTransform avant de faire le DrawString, en lui passant en paramètre l'angle de rotation voulu en degrés (sens des aiguilles d'une montre)

    Citation Envoyé par zooffy Voir le message
    - le double de la question, parce que je pense que ça doit pas être possible et qu'il faut passer par un "dessin". Du coup, comment je peux ouvrir mon image et lui "coller" un gif devant ? Pareil, j'ai cherche à lier un Graphics à un gif, amis je trouve pas les commandes qui pourraient me permettre de faire ça.
    C'est le même principe, avec l'objet Graphics tu peux dessiner une image (méthode DrawImage). Une fois que tu as ton graphics sur l'image d'origine, tu charges une autre image et tu la dessines sur le graphics :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Using g As Graphics = Graphics.FromImage(imageOriginale)
        Using filigrane As Image = Image.FromFile("filigrane.gif")
            g.DrawImage(filigrane, x, y)
        End Using
    End Using

  11. #11
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Tomlev

    Je teste tout ça et je reviens vérouiller si j'ai pas rencontré de nouveau problème.

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Par défaut
    Pour Info en dehors de VB.Net :

    Ayant eu à mes débuts, et j'y suis encore, 15.000 images à traiter, je me suis tourné vers une solution graphique car j'ignorais la possibilité de le faire en VB.Net.
    Certains logiciels graphiques permettent le traitement en lot pour effectuer la même tache, par exemple insérer un texte (Copyright) ou une image (en anglais "Watermark"). Seule limitation : le texte ou l'image à insérer dans le lot doit être unique.

    Un de ces logiciels Free est disponible ici : http://www.faststone.org c'est Faststone Photo Resizer.
    Dans ce logiciel une image (qui peut être du texte donc) et qui serait au format png ou psd (avec un fond transparent) peut se retrouver en diagonale.

    Je n'en raconte pas plus ici car c'est sur le forum "Imagerie" que se trouvent les spécialistes bien plus compétents que moi en cette matière.

    Bon courage

  13. #13
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Zinneke, mais je ne peux pas utiliser ta solution car l'incrustation doit avoir lieu au moment où l'utilisateur envoi sont image, donc en direct.

    Mais je garde l'info pour les cas où je devrais faire des lots, un jour peut être.

  14. #14
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Comme promis, TOmlev, je reviens pour les points évoqués plus tôt.

    Le RotateTransform, OK, c'est cool, j'ai lus qu'à trouver les bons paramttres.

    Par contre, le Stream, je sèche. D'abords, j'ai pas réussi à trouver la Classe Stream. Ensuite, j'arrive pas à comprendre comment je le récupère de mon FileUpload. Regarde le CodeBehind Mis à jour que je poste ici.

    Enfin, l'incrustation d'une image sur l'autre, ça marche pas. Mais j'ai pas de message d'erreur, donc le code, lui, fonctionne. Bref, je sèche. Je me demande s'il n'y a pas une histoire de d'ordre des couches ou un truc comme ça.

    Donc voici mon code mis à jour.
    Dans mon composant utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim fullSizeImg As System.Drawing.Image
     
    fullSizeImg = Image.FromFile(NomFichierTemp)
    ProjetY.TraitementImage.AjoutFiligrane(fullSizeImg, NomCheminPhoto)
    NomFichierTEmp est el nom du fichier posé qui sera supprimer plus tard par une opération de maintenance. C'est là que je voudrais bien faire le Stream, ça m'éviterait de stocker un fichier et de le supprimer aprés. Et je pense que ça serait plus performant.

    Et dans la Classe de traitement d'image que je suis en train de confectionner :
    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
     
    Public Shared Sub AjoutFiligrane(ByRef img As Image, ByVal nomimg As String)
     
                Using g As Graphics = Graphics.FromImage(img)
                    Using filigrane As Image = Image.FromFile(HttpContext.Current.Server.MapPath("/App_Themes/EasyRencard/coquine.gif"))
                        g.DrawImage(img, 0, 0)
                    End Using
                End Using
     
                Try
                    img.Save(HttpContext.Current.Server.MapPath(nomimg))
                Catch ex As Exception
                    ProjetY.Outils.Logage(ex.Message.ToString)
                End Try
     
            End Sub
    Là, pas de message d'erreur, tout va bien, sauf que y a pas d'incrustation.

    Tu as une idée ?

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Par contre, le Stream, je sèche. D'abords, j'ai pas réussi à trouver la Classe Stream. Ensuite, j'arrive pas à comprendre comment je le récupère de mon FileUpload.
    La classe Stream est définie dans le namespace System.IO. Tu devrais vraiment te renseigner là-dessus, c'est la base de toutes les opérations d'entrées/sorties (flux fichier, réseau, mémoire, crypto...)
    La class FileUpload a une propriété FileContent, qui renvoie un Stream permettant de lire le fichier uploadé. Tu n'as donc pas besoin d'enregistrer le fichier uploadé sur le disque, tu peux l'utiliser directement pour le traitement, et enregistrer l'image résultat seulement à la fin.

    D'autre part, dans ton code, tu ouvres un Graphics pour l'image img, et tu dessines dessus... l'image img elle-même ! Donc ça ne sert à rien... Il faudrait plutôt faire g.DrawImage(filigrane, 0, 0) (pour l'instant tu n'utilises pas le filgrane...)

    Au final ça devrait donner quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Using uploadedImage As Image = Image.FromStream(fileUploadImage.FileContent)
        Using g As Graphics = Graphics.FromImage(uploadedImage)
            Using filigrane As Image = Image.FromFile(cheminDuFiligrane)
                g.DrawImage(filigrane, 0, 0)
            End Using
        End Using
        uploadedImage.Save(cheminOuTuStockesLImage)
    End Using
    Petite remarque sur les perfs : si tu veux faire un traitement en masse, il vaut mieux charger le filigrane une seule fois au début du traitement et le décharger à la fin (donc mettre le bloc Using autour du reste, et non à l'intérieur)

    Sinon j'aime bien le nom de l'image pour le filigrane

  16. #16
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide.

    J'ai deux soucis :
    - le Stream, je le trouve pas dans System.IO. C'est par là que j'avais orienté ma recherche, parce que je sais que cette Classe est importante pour tous les transferts et traitements de fichier. Y a deux trucs : StreamReader et StremWriter, mais pas Stream tout seul.
    - Avec ton code j'ai une erreur générique dns GDI+ et je cormprends pas.

    Voici les modif que j'ai faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Shared Sub AjoutFiligrane(ByRef img As Image, ByVal nomimg As String, ByRef imgbase As FileUpload)
                Using uploadedImage As Image = Image.FromStream(imgbase.FileContent)
                    Using g As Graphics = Graphics.FromImage(uploadedImage)
                        Using filigrane As Image = Image.FromFile(HttpContext.Current.Server.MapPath("/App_Themes/EasyRencard/coquine.gif"))
                            g.DrawImage(filigrane, 0, 0)
                        End Using
                    End Using
                    uploadedImage.Save(nomimg)
                End Using
    End Sub
    Tu noteras l'envoi du FileUpload par Référence, c'est peut être ça qui coince. Mais je trouve pas pourquoi.

    Le site final est en rapport avec le nom du filigranne

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zooffy Voir le message
    - le Stream, je le trouve pas dans System.IO. C'est par là que j'avais orienté ma recherche, parce que je sais que cette Classe est importante pour tous les transferts et traitements de fichier. Y a deux trucs : StreamReader et StremWriter, mais pas Stream tout seul.
    Comment ça tu le trouves pas ? Il est dans System.IO, dans l'assembly mscorlib (qui est toujours référencé). Si tu ne le vois pas dans l'intellisense, ça ne veut pas dire qu'il n'existe pas... Par défaut l'Intellisense de VB n'affiche que les éléments les plus couramment utilisés. Pour tout voir, clique sur l'onglet "Tous" de la liste déroulante de l'Intellisense.

    Enfin, de toutes façons, le code que je t'ai donné ne fait jamais explicitement référence à la classe Stream, donc tu t'en fous un peu

    Citation Envoyé par zooffy Voir le message
    - Avec ton code j'ai une erreur générique dns GDI+ et je cormprends pas.
    Sur quelle instruction exactement ? sur le Save je suppose ? Tu passes quelle valeur pour le paramètre nomimg ?

    Citation Envoyé par zooffy Voir le message
    Tu noteras l'envoi du FileUpload par Référence, c'est peut être ça qui coince.
    Non, ça ne change rien. D'ailleurs il est inutile de passer ces paramètres par référence, vu que tu ne modifies pas leur valeur...
    Il y a quelque part sur le forum une discussion qui explique bien les différences entre les notions de type référence/type valeur et passage de paramètre par référence/par valeur, je vais essayer de la retrouver

    EDIT: bon, pas moyen de remettre la main dessus... les mots-clés "valeur" et "référence" sont utilisés tellement souvent que c'est pas des critères de recherche très utiles

  18. #18
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Pour Stream OK, c'est juste dans les premiers bouts de code qu'il y avait cette référence.

    L'erreur interveint effectivement au moment du SAve, mais je n'a pas plus de détail, du coup je ne sais vraiment pas quelle est l'erreur.
    nomimg est égal à ça :
    /App_Themes/Site/PhotoMembre/90e853a3-6775-4a0d-9628-b2ce7a9760c6ph1.jpg
    qui est le chemin relatif où le fichier doit être placé. Je vois que c'est le bon chemin.

    Le truc de référence, c'est parce que j'ai vu en formation que si tu fais un paramettre de Méthode ByVal, tu envois l'objet en lui même, donc tu consomme de la mémoire et si tu fais un ByRef, tu n'envois qu'un "pointeur" vers l'objet, donc moins de mémoire consommée. Mais si tu dis que change rien, pas de souci, d'autant que je n'ai pas d'erreur là dessus précisément.
    A moins que justement, cela n'envoi pas ce qu'il faut mais qu'il me le dise que plus tard.

    Je sèche.

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il faut faire un MapPath de ce chemin avant de la passer en paramètre de Save...
    Vérifie aussi si le fichier n'existe pas déjà, et s'il n'est pas ouvert par un autre process (peux-tu le renommer ou le supprimer ?)

    Citation Envoyé par zooffy Voir le message
    Le truc de référence, c'est parce que j'ai vu en formation que si tu fais un paramettre de Méthode ByVal, tu envois l'objet en lui même, donc tu consomme de la mémoire et si tu fais un ByRef, tu n'envois qu'un "pointeur" vers l'objet, donc moins de mémoire consommée.
    Où t'as fait ta formation, que j'y aille pas ?

    C'est vrai pour un type valeur (types primitifs comme Int32, Boolean, Double, etc, et toutes les structures), mais pas pour un type référence (String, Object, et toutes les classes). Pour un type référence, tu ne copies jamais l'objet, c'est toujours une référence qui est passée. La différence, c'est que :
    • avec ByVal, tu passes directement la valeur de la variable (çàd une copie de la référence vers l'objet pour un type référence, ou une copie de l'objet lui-même pour un type valeur), donc si tu lui affectes une autre valeur dans la fonction, ça ne modifie pas la référence pour le code appelant.
    • avec ByRef, tu passes une "référence vers la variable" : tu manipules donc la même variable que le code appelant, et si tu la modifies dans la fonction, le code appelant voit la modification


    Ce sera plus clair avec un exemple :
    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
    	Sub Main()
    		Dim s As String = "Hello world !"
    		Dim i As Integer = 42
    		Console.WriteLine("Valeurs initiales : s = {0}, i = {1}", s, i)
    		MethodByVal(s, i)
    		' La méthode ne modifie pas les variables locales, les valeurs sont toujours "Hello world !" et 42
    		Console.WriteLine("Après appel à MethodByVal : s = {0}, i = {1}", s, i)
     
    		MethodByRef(s, i)
    		' La méthode modifie les variables locales, les valeurs sont maintenant "Foobar" et 99
    		Console.WriteLine("Après appel à MethodByRef : s = {0}, i = {1}", s, i)
    	End Sub
     
    	Sub MethodByVal(ByVal x As String, ByVal y As Integer)
    		x = "Foobar"
    		y = 99
    	End Sub
     
    	Sub MethodByRef(ByRef x As String, ByRef y As Integer)
    		x = "Foobar"
    		y = 99
    	End Sub

  20. #20
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Ok, merci pour le petit cours de ByREf et ByVal.
    Faut pas jeter la pierre à mon formateur, il est top niveau chez Microsoft, genre MCP + 18 et il a écrit deux ou trois bouquins sur le .NET.
    De mémoire je crois que le seul Mircrosoft Architect de France, ou un truc comme ça.

    Par contre, on peut plus vite dire que c'est moi qui est mal écouté, je ne suis pas forcément un élève assidu et avec l'âge, ça ne s'arrange pas ! ! !

    Bref, revenons à nos moutons, même si c'est un plaisri de causer avec toi.

    Aprés avoir mis un MapPath (j'aurais du y penser tout seul.....) ben j'ai eu un surprise assez sympatique mais bizarre : j'ai au moins une photo où ça ne marche pas !

    Et vu que j'ai pas de message d'erreur, que la photo arrive bien au bout, ben je cherche pourquoi celle là ne fonctionne pas alors que les autres si.

    Faut que je décortique la photo finale dans PhotoShop pour voir si l'incrustation ne passerait pas dans une trappe graphique quelconque.

    En tout cas, super cool toutes ces infos, merci beaucoup de ta patience.
    Avec tout ce que tu m'a filé (et je n'oublie pas Poulain non plus) je vasi pouvoir faire des beaux filigrannes, texte et/ou image et le tout en dynamique.

    Kenavo

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Manipuler des fichiers Excel avec Perl
    Par Buboba dans le forum Modules
    Réponses: 2
    Dernier message: 04/09/2012, 13h54
  2. manipuler des fichier xml avec jdom
    Par sagon dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 02/07/2011, 19h34
  3. manipulation des fichier xsl avec vba excel
    Par naim8622 dans le forum Excel
    Réponses: 1
    Dernier message: 23/01/2009, 00h13
  4. Manipulation des fichiers XML avec Pl/SQL
    Par wislam2007 dans le forum PL/SQL
    Réponses: 0
    Dernier message: 12/09/2008, 04h10
  5. Manipuler des fichiers xls avec c++
    Par 151085 dans le forum Visual C++
    Réponses: 2
    Dernier message: 27/08/2007, 15h18

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