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 :

Superposition et découpe d'image


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut Superposition et découpe d'image
    Bonjour,
    Je dois faire une petite application en C# permettant de "manipuler" des images. Je m'explique.

    Cette application prendra deux images:
    • Une image (PNG) avec une partie transparente. Cette partie peut-être de n'importe quelle forme représente le "mask".


    • Une seconde image qui va pouvoir être découpée suivant le mask établie précédemment avec la première image.


    Le but de l'application est donc de superposer les deux images (l'image comprenant le "mask" par dessus la deuxième). L'utilisateur pourra ensuite via sa souris bouger la seconde image et lorsque ça lui plaira il pourra choisir de découper l'image suivant le mask.

    Avez vous des idées de comment faire cela?

    Merci d'avance.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut
    Personne?

    J'ai réussi a superposer mes deux images. A faire bouger la deuxième image suivant les actions de l'utilisateur.
    Mais je n'arrive pas a récupérer la forme transparente comprise dans le "mask" et donc de découper l'image utilisateur suivant ce "mask".

    Personne ne voit comment faire?

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Bonjour,
    moi je vois bien un truc comme ça bien que ce ne soit pas très performant... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (int y = 0; y < bmpOrigine.Height; y++) { //pour chaque ligne
                    for (int x = 0; x < bmpOrigine.Width; x++) { // pour chaque colonne
                        if (bmpMasque.GetPixel(x, y).A == 100) { //Si alpha = 100 c'est qu'on est transparent. (enfin je crois :))
                            bmpNouveau.SetPixel(x, y, bmpOrigine.GetPixel(x, y)); //On passe la composante couleur du bitmap d'origine au nouveau bitmap
                        }
                        else {
                            bmpNouveau.SetPixel(x, y, Color.Black); //sinon on met du noir ?
                        }
                    }
                }

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Par défaut
    Bonjour,
    moi je vois bien un truc comme ça bien que ce ne soit pas très performant... :

    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
     
    Bitmap bmpOrigine = new Bitmap(40, 40); //Bitmap d'origine
    Nitmap bmpMasque = new Bitmap(40, 40); //Bitmap qui fait office de masque
    //todo initialiser bmpOrigine et bmpMasque avec ta fonction de placement du masque sur l'image d'origine.
     
    Bitmap bmpNouveau = new Bitmap(bmpOrigine.Width, bmpOrigine.Height);//nouveau bitmap
    for (int y = 0; y < bmpOrigine.Height; y++) { //pour chaque ligne
        for (int x = 0; x < bmpOrigine.Width; x++) { // pour chaque colonne
            if (bmpMasque.GetPixel(x, y).A == 100) { //Si alpha = 100 c'est qu'on est transparent. (enfin je crois :))
                bmpNouveau.SetPixel(x, y, bmpOrigine.GetPixel(x, y)); //On passe la composante couleur du bitmap d'origine au nouveau bitmap
            }
            else {
                 bmpNouveau.SetPixel(x, y, Color.Black); //sinon on met du noir ?
            }
         }
    }

    En espérant que ça puisse t'aider. Sinon postes ton bout de code qui permet le placement du masque sur l’image d'origine car je ne vois pas très bien comment tu fais.

    A+

    EDIT : dsl pour le double post ma souris à ripé...

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Par défaut
    Merci

    Grace a ton bout de code je vois comment m'en sortir un petit peu.
    Je vais essayer cela des que j'aurais le temps

    Merci encore

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour Droide63000..
    La premiere difficulte qui surgit quand on travaille sur des images qu'on veut superposer ou comparer est que les 2 images en question :
    - doivent avoir la meme dimension.....
    Cela permet de pouvoir mapper les pixels des 2 images grace/:
    - soit à leur coordonnees
    - soit à leur position dans un tableau de bytes(avec la fonction Bitmap.Locks)...

    Bref ceci etant,il existe une fonction API tres interessante qui permet de creer un mask à la volee en mettant lowColor à highColor (=transparent.Color)...c'est :
    -ImageAttributes.SetColorKey(lowColor ,highColor)
    L'exemple qui suit utilise 3 pictureboxes(et leur bmp associes) :
    -picFrom:image source
    -picMask:image servant de mask .Le masque est cree à la volee en choisissant une couleur quelconque dans l'image masque..avec mouse_click
    -picTo: sert à afficher le resutat.....avec button Apply Mask..avec un code similaire à celui donnee par lead8209 ....
    De plus le background image de pic est charge avec un image white(à creer sous paint) pour mieux voir l'apercu dans picto.....

    code .cs:

    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
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    //Ajout :
    //-3 picturebox de meme taille...(picFrom,picMask,picTo).
    //-un bouton en haut du form nomme apply
    //-un label en bas du form
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Imaging;
     
    namespace WinMaskImage
    {
        public partial class frmColorMap : Form
        {
            public frmColorMap()
            {
                InitializeComponent();
     
                // image source auquel sera applique le masque...
                picFrom.BackColor = Color.Transparent;
     
                // image destination finale apres applique du masque...
                picTo.BackColor = Color.Transparent;
     
                // image masque 
                picMask.BackColor = Color.Transparent;
     
                // size mode à normal des 3 pics
                picFrom.SizeMode = PictureBoxSizeMode.Zoom;
                picTo.SizeMode = PictureBoxSizeMode.Zoom;
                picMask.SizeMode = PictureBoxSizeMode.Zoom;
            }
            //chargement des images en resources
            private void frmColorMap_Load(object sender, EventArgs e)
            {
                //image source
                picFrom.Image = WinMaskImage.Properties.Resources.Nenuphars;
     
     
                //image mask
                picMask.Image = WinMaskImage.Properties.Resources.Coucher_de_soleil;
     
     
                //image destination à creer
                picTo.Image = null;
     
                // image d'arrier plan dans picTo pour mieux voir l'effet
                // ne fait pas partie du image destination final
                picTo.BackgroundImage = WinMaskImage.Properties.Resources.backgroundwhite;
                picTo.BackgroundImageLayout = ImageLayout.Stretch;
     
     
            }
            //click_mouse pour selection du color de transparence du mask 
            private void picMask_MouseClick(object sender, MouseEventArgs e)
            {
                //choix de couleur sur le bitmap de masque
                Bitmap bmpMask = (Bitmap)picMask.Image;
                Color choiceColor = bmpMask.GetPixel(e.X, e.Y);
                label2.BackColor = choiceColor;
     
                //ImageAttributes peut setter le color de transparence choisi....
                ImageAttributes attr = new ImageAttributes();
                attr.SetColorKey(choiceColor ,Color.Transparent);
     
                // bmp temporaire avec taille ajuste = taille image source (picFrom)
                // un graphics issu de ce bmp
                Bitmap tempBitmap = new Bitmap(picFrom.Image.Width, picFrom.Image.Height);
                Graphics gr = Graphics.FromImage(tempBitmap);
     
                // Redessine image mask  mis à l'echelle et rectifie avec le ImageAttributes
                // dan tempBitmap....
                Rectangle destRect = new Rectangle(0, 0, tempBitmap.Width, tempBitmap.Height);
                gr.DrawImage(bmpMask, destRect, 0, 0, bmpMask.Width, bmpMask.Height,
                    GraphicsUnit.Pixel, attr);
     
                //dispose object graphics
                gr.Dispose();
     
                // affecte ce tempBitmap  à picMask
                picMask.Image = tempBitmap;
            }
            //nb: Cette ligne de code ne fonctionnera pas comme attendu
            //if(bmpMask.bmpMask.GetPixel(i, j)==Color.Transparent)
     
            //application du mask avec setpixel 
            //remarquez : picTo.Image , picMask.Image et picto.Image =>identique Size
            private void btnApplyMask_Click(object sender, EventArgs e)
            {
     
                // nouveau bmp à partir de image source
                // (pas de ref sinon source sera altere....)
                Bitmap bmpTo = new  Bitmap(picFrom.Image);
     
                // un ref bmp sur image mask oui
                Bitmap bmpMask = (Bitmap)picMask.Image;
     
                //masquage du bmp  avec bmpMask
                for (int i = 0; i < bmpMask.Width; i++)
                {
                    for (int j = 0; j < bmpMask.Height; j++)
                    {
                        if (bmpMask.GetPixel(i, j).A == 0) 
                        {
                            // composante alpha =0 => pixel transparent
                            bmpTo.SetPixel(i, j, Color.Transparent);
                        }
                    }
                }
                // affecte bmpTo à picTo
                picTo.Image = bmpTo;
                // save if necessary
                picTo.Image.Save("test.bmp");
     
            }
            //reset des PictureBox.Image pour un autre masquage 
            private void btnReset_Click(object sender, EventArgs e)
            {
                picFrom.Image = WinMaskImage.Properties.Resources.Nenuphars;
                picMask.Image = WinMaskImage.Properties.Resources.Coucher_de_soleil;
                picTo.BackgroundImage = WinMaskImage.Properties.Resources.backgroundwhite;
                picTo.BackgroundImageLayout = ImageLayout.Stretch;
                picTo.Image = null;
     
            }
     
     
     
        }
    }
    bon code.................

Discussions similaires

  1. [GD] Découpe d'images possible?
    Par taybott dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/04/2008, 01h44
  2. [GD] Perte de qualité lors de la superposition de 2 petites images sur une autre
    Par angebleu1759 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 04/12/2007, 15h46
  3. Découpé une image et faire un effet sur le contour
    Par sliverman dans le forum Flash
    Réponses: 8
    Dernier message: 14/06/2007, 13h39
  4. décalage et découpe d'image sous FF
    Par greg1386 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 10/03/2007, 01h15
  5. [Image]superposition et calque des images
    Par manplum dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 01/02/2006, 14h24

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