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

C# Discussion :

Option Annuler sur traitement image


Sujet :

C#

  1. #1
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut Option Annuler sur traitement image
    Bonjour à tous.

    Je vous envoie ce message, chers membres de la communauté C#pienne, pour vous demander un conseil.

    Voilà, dans un cadre pédagogique, je dois réaliser un petit programme intitulé "Album photo". Ce programme doit être capable de :

    - ouvrir une image (cela va de soi);
    - effectuer un petit traitement sur l'image (griser, inverser les couleurs,... j'utilise le site suivant: ici);
    - donner la possibilité de sauver les traitement;
    - annuler un traitement effectuer;
    - ...

    Pour l'option annuler, comment pourrais-je procéder?
    J'ai mis en place une variable de type Bitmap pour faire une sorte de "back-up" avant le traitement sur mon image.
    Donc j'ai la possibilité de revenir une étape en arrière.
    Maintenant j'aimerais mettre un place un système qui me permettrais de revenir plusieurs étapes en arrière, mais je ne sais pas comment l'implémenter.
    J'ai songé à une liste avec toutes les images que je copierais dedans avant le traitement, mais j'ai peur que le programme ne devienne très vite trop important et sature la RAM.

    Quelqu'un parmi vous aurait-il une autre solution à me proposer? Attention, je suis débutant en C#.

    Je vous remercie d'avance pour vos conseils, et remarques.

    Sur ce , je vous souhaite un agréable w-e,

    Richard_sraing

    [EDIT]
    Je viens de voir qu'il est très simple d'implémenter une pile ou une file en C#; Maintenant j'aimerais savoir si on peut implémenter une file de type Bitmap...

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Je ne te conseille pas une pile (Stack) car dès que tu auras un nombre trop important d'objets dans la pile, tu ne pourras pas enlever le plus vieux pour gagner de la place.

    La solution est donc d'utiliser simplement un ArrayList qui permet de stocker une collection d'objets (dans notre cas des Bitmap).

    Avant de faire un traitement sur ton objet Bitmap, tu devras faire une copie de cet objet et le placer dans ta collection. Tout en vérifiant qu'il n'y a pas trop d'objets dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Initialisation
    Bitmap monImage = new Bitmap("pathimage");
    ArrayList maSauvegardeDeTraitements = new ArrayList();
    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
    //Sauvegarde avant traitement
     
    // Crée une copie exacte de l'objet
    Bitmap maCopie = (Bitmap)monImage.Clone();
     
    // Vérification qu'il y a moins de 10 objets dans la collection
    if (maSauvegardeDeTraitements.Count < 10)
    {
        maSauvegardeDeTraitements.Add(maCopie);
    }
    else
    { 
        // On retire l'objet le plus vieux
        maSauvegardeDeTraitements.RemoveAt(0);
     
        maSauvegardeDeTraitements.Add(maCopie);
    }
    Maitenant pour retirer le dernier objet sauvegardé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Récupération du dernier objet sauvegardé
    if (maSauvegardeDeTraitements.Count > 0)
    {
        // Récupération de la dernière sauvegarde
        Bitmap maDerniereSauvegarde = maSauvegardeDeTraitements[maSauvegardeDeTraitements.Count - 1];
     
        // Suppression de l'objet récupéré dans la liste
        maSauvegardeDeTraitements.Remove(maDerniereSauvegarde);
    }
    else
    {
        MessageBox.Show("Il n'y a plus d'objet sauvegardé !");
    }
    Si tu as des questions, n'hésite pas.

  3. #3
    Membre habitué Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Points : 182
    Points
    182
    Par défaut
    Merci beaucoup à toi Cardi.

    J'avais essayer de le faire avec une pile, mais le problème c'est que je n'ai jamais réussi à récupérer la sauvegarde de l'image.

    Mais avec ton système, lorsque je vérifie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (maSauvegardeDeTraitements.Count < 10)
    Je pense que je serais donc limité à 10 étapes annulées...

    C'est toujours mieux que rien...

    Merci du coup de main ("code").

    Bonne journée et bon w-e à toi Cardi.

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Avec la pile (Stack), tu ne peux récupérer que le dernier objet mis dans la collection (avec Pop). Ce qui veut dire que si tu vex récupérer le premier élément, tu dois tout retirer avant.

    Pour ce qui est du 10, c'est un exemple. Rien ne t'empêche de mettre 5, 50, 500 (pas conseillé quand même :p).

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    la solution de sauvegarder les images dans un arraylist est la solution la plus
    simple, et la plus rapide, mais pas forcément la "plus pertinente" en terme
    de mémoire...

    Supposons que ton image fasse 10 mO... et que tu fais un certain nombre
    de traitement dessus, ca va commencer à faire bcp de monde non ?

    Une solution intermédiaire peut-etre la suivante :

    Tu sauvegardes les Actions effectués et non le résultat...
    Tu poses des jalons majeurs qui correspondent à une copie de ton image...

    En clair, si tu fais 100 traitements sur ton image, tu peux te dire que tu
    sauvegardes l'image toutes les 10 traitements... et que par contre, tu es
    capable d'avoir une classe TREATMENT qui sait te dire quel traitement tu
    as entre deux images ?

    (un peu à la mode du mjpg ou tu encodes 1 images sur X et entre l'image
    X et X+1 tu n'as que les changements, pas la totalité de l'image)

    Tu vois ce que je veux dire ?

    L'interet de "ma" méthode est un gain de place... en terme de mémoire...
    (par contre, le traitement sera legerement plus lent car il est plus "lent"
    de refaire les traitements que d'afficher leur résultat)

    The Monz, Toulouse

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

Discussions similaires

  1. aide sur traitement image bitmap
    Par tilily dans le forum C
    Réponses: 10
    Dernier message: 19/02/2010, 19h14
  2. des traitement sur une image couleur
    Par Sarah! dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 28/05/2008, 15h14
  3. Réponses: 1
    Dernier message: 15/05/2008, 20h11
  4. traitement sur une image
    Par amazircool dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 15/05/2007, 22h52

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