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

Windows Forms Discussion :

[FreeImage] probleme avec methode invert


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Points : 121
    Points
    121
    Par défaut [FreeImage] probleme avec methode invert
    Bonjour,
    je suis en train de développer une application qui manipule des images TIF bi-couleur (noir et blanc), et j'ai besoin d'une fonction qui inverse la couleur d'une image donnée si elle était noire.
    Voici mon code que j'utilise en ce moment:
    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
            public static void CheckColor(string filePath)
            {
                FreeImageBitmap fibit = new FreeImageBitmap(filePath);
                int numFrames = fibit.FrameCount;
                for (int i = 0; i < numFrames; i++)
                {
                    fibit.SelectActiveFrame(i);
                    if(fibit.ColorType != FREE_IMAGE_COLOR_TYPE.FIC_MINISWHITE)
                    {
                        fibit.Invert();
                        fibit.Save(fichePath);
                    }
                }
                fibit.Dispose();
            }
    Mais apparament, il ne fonctionne pas bien, vu que le résultat n'est pas celui que j'ai souhaité : une image noire n'est pas transformée en blanche meme si j'y applique la méthode Invert() (voir le code)

  2. #2
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu es sûr que l'exécution passe bien dans le if ?
    C'est quoi cette classe FreeImageBitmap ? A priori tu peux faire ça avec les classes du framework...

  3. #3
    Membre régulier Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Points : 121
    Points
    121
    Par défaut
    FreeImageBitmap est une des classes de la librairie FreeImage
    Si tu as une solution .NET je suis preneur
    merci

  4. #4
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Il suffit de jouer sur la palette. Bon, c'est un peu bourrin, mais ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    Bitmap bmp = Image.FromFile("toto.bmp") as Bitmap;
                    ColorPalette palette = bmp.Palette;
                    for (int i = 0; i < palette.Entries.Length; i++)
                    {
                        palette.Entries[i] = InvertColor(palette.Entries[i]);
                    }
                    bmp.Palette = palette;
                    pictureBox1.Image = bmp;
    Par contre ça ne fonctionne qu'avec un bitmap en couleurs indexées...
    (testé avec des images bmp en noir et blanc ou 256 couleurs)

    Sinon, si les couleurs sont pas indexées tu peux jouer directement au niveau des pixels, avec GetPixel/SetPixel (un peu lent) ou LockBits (plus rapide mais plus complexe)

  5. #5
    Membre du Club
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 65
    Points
    65
    Par défaut
    Il me semble qu'on peut le faire avec l'objet System.Drawing.Image
    Edit : j'ai rien dit ca fonctionne pas ... dsl

    Mais tu peux utiliser l'objet Image à la place de Bitmap que te suggère tomlev

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Image bmp = new Bitmap(filePath);
    ColorPalette palette = bmp.Palette;
    for (int i = 0; i < palette.Entries.Length; i++)
    {
        palette.Entries[i] = InvertColor(palette.Entries[i]);
    }
    bmp.Palette = palette;
    pictureBox1.Image = bmp;

  6. #6
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkLeon Voir le message
    tu peux utiliser l'objet Image à la place de Bitmap que te suggère tomlev
    C'est vrai que j'ai utilisé Bitmap un peu par habitude, mais dans mon code on aurait pu remplacer Bitmap par Image (d'ailleurs ça aurait évité un cast)...
    Par contre pour les approches avec Get/SetPixel et LockBits, il faut utiliser la classe Bitmap

  7. #7
    Membre du Club
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 65
    Points
    65
    Par défaut
    et avec le CopyTo de Entries on pourrait pas le faire plus simplement ?
    Je suis pas trop pour les boucle for ...

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkLeon Voir le message
    et avec le CopyTo de Entries on pourrait pas le faire plus simplement ?
    Je suis pas trop pour les boucle for ...
    pas trop pour les boucles for ?
    et qu'est-ce que tu crois qu'elle fait la méthode CopyTo ?

  9. #9
    Membre du Club
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 65
    Points
    65
    Par défaut
    Je pense qu'elle utilise un delegate.
    Les boucles for sont réputé pour être lente.

  10. #10
    Membre régulier Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par DarkLeon Voir le message
    Les boucles for sont réputé pour être lente.
    C'est pour ca que j'ai pas aimé la methode .NET.
    Je sais pas comment est le code de Invert de FreeImage (d'ailleurs il est accessible puisqu'elle est open source) mais ca fait rapidement !
    enfin j'ai trouvé la solution a mon probleme, ca ne marchit pas qu'avec des images tif spéciales (je connais pas cette spécialité qu'elles ont) mais j'ai pu la détecter.
    merci pour tous

  11. #11
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkLeon Voir le message
    Les boucles for sont réputé pour être lente.
    Je crois que c'est une des affirmations les plus absurdes que j'ai jamais entendues...
    Tu es obligé de faire une boucle (que ce soit for, foreach, while...) dès lors que tu répètes une action sur plusieurs éléments. Si on pouvait faire autrement et que les boucles posaient vraiment un problème de performance, ça fait longtemps que ça aurait disparu !

    Après, il faut les utiliser intelligemment, c'est sûr que si tu fais plein de boucles imbriquées sur beaucoup d'éléments, ça va être lent...

  12. #12
    Membre régulier Avatar de subzero01
    Inscrit en
    Décembre 2007
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2007
    Messages : 281
    Points : 121
    Points
    121
    Par défaut
    je suis d'accord avec toi tomev, et ça ne veut pas dire que la methode Invert que j'utilise ne se sert pas d'une boucle !
    la différence est que sur .NET il n'est pas conseillé de travailler avec des données à bas niveau ! et il serait mieux et plus performant de procurer ce travail à un code précompilé (bas niveau aussi), car comme tu le connais .NET doit passer d'autres stages pour arriver au code machine.

  13. #13
    Membre du Club
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je crois que c'est une des affirmations les plus absurdes que j'ai jamais entendues...
    Tu es obligé de faire une boucle (que ce soit for, foreach, while...) dès lors que tu répètes une action sur plusieurs éléments. Si on pouvait faire autrement et que les boucles posaient vraiment un problème de performance, ça fait longtemps que ça aurait disparu !

    Après, il faut les utiliser intelligemment, c'est sûr que si tu fais plein de boucles imbriquées sur beaucoup d'éléments, ça va être lent...
    Je suis d'accord avec toi, mais on a eu pleins de problème avec des boucles For, nous avons modifier un certains nombre de codes avec des List et utilisé des delegate, et la c'est le jour et la nuit.
    Dans certains cas nous n'avons pas le choix (parcourt en totalité par exemple), mais si je peux lévité je n'hésite pas

Discussions similaires

  1. Probleme avec methode dans un Button
    Par PascalStl dans le forum Tkinter
    Réponses: 16
    Dernier message: 01/06/2013, 16h42
  2. IbClientDataSet probleme avec methode FindField et Find
    Par o_live dans le forum C++Builder
    Réponses: 0
    Dernier message: 11/05/2009, 17h04
  3. Problem avec methode contains.
    Par ox@na dans le forum Langage
    Réponses: 7
    Dernier message: 23/02/2008, 20h31
  4. [debutant] probleme avec methode virtuelle pure
    Par Treuze dans le forum Débuter
    Réponses: 10
    Dernier message: 21/04/2006, 12h58
  5. probleme avec methode get
    Par Tr@nkill dans le forum ASP
    Réponses: 2
    Dernier message: 12/05/2005, 13h54

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