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 :

Sauvegarde d'un panel


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut Sauvegarde d'un panel
    Bonjour,
    afin de pouvoir sauvegarder une ou plusieurs images préalablement ouvertes dans un panel, je crée un rectangle avec la fonction Paint comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void panel1_Paint(object sender, PaintEventArgs e)
            {
                if (autorisation == true)
                {
                    Pen stylonoir = new Pen(Brushes.Black);
                    stylonoir.Width = 1;
                    e.Graphics.DrawRectangle(stylonoir, rec);
                    autorisation = false;
                }
            }
    rec étant un rectangle que j'ai créé.
    La taille de ce rectangle est variable et dépend des fonctions Mouse_Down et Mouse_Up du panel :
    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
    private void panel1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                    positionClick = e.Location;
            }
     
            private void panel1_MouseUp(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    positionClick2 = e.Location;
                    autorisation = true;
                    if (positionClick.X > positionClick2.X)
                        rec.Width = positionClick.X - positionClick2.X;
                    else
                        rec.Width = positionClick2.X - positionClick.X;
                    if (positionClick.Y > positionClick2.Y)
                        rec.Height = positionClick.Y - positionClick2.Y;
                    else
                        rec.Height = positionClick2.Y - positionClick.Y;
                    if (positionClick.X > positionClick2.X && positionClick.Y > positionClick2.Y)
                        rec.Location = new Point(positionClick2.X, positionClick2.Y);
                    if (positionClick.X < positionClick2.X && positionClick.Y > positionClick2.Y)
                        rec.Location = new Point(positionClick.X, positionClick2.Y);
                    if (positionClick.X > positionClick2.X && positionClick.Y < positionClick2.Y)
                        rec.Location = new Point(positionClick2.X, positionClick.Y);
                    if (positionClick.X < positionClick2.X && positionClick.Y < positionClick2.Y)
                        rec.Location = new Point(positionClick.X, positionClick.Y);
                }
            }
    La création du rectangle fonctionne, quelque que soit le sens de la sélection (d'en bas à gauche à en haut à droite, etc...).
    Mon problème est que, lorsque je lance la sauvegarde, celle-ci ne s'effectue pas selon les dimensions du rectangle, la taille à l'air d'être respectée mais pas sa localisation, cette dernière semblerait se positionner par rapport au Form 1, et non au panel1. Certaines fois, le contenu est totalement noir ou ne prend qu'une partie de ce que je voulais enregister, voici un exemple : Nom : jardins dieu.jpg
Affichages : 115
Taille : 149,5 Ko Image que je veux save
    Nom : lol.png
Affichages : 106
Taille : 76,8 Ko Image sauvegardée si j'encadre l'image avec le rectangle
    Nom : lol2.png
Affichages : 110
Taille : 238 octets Image sauvegardée si j'encadre un espace vide

    Voici le code de la sauvegarde :
    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
    private void enregistrerToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (rec.Width == 0 && rec.Height == 0)
                    MessageBox.Show("Rien à enregistrer !", "Erreur lors de la sauvegarde", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                else
                {
                    Bitmap bmp = new Bitmap(rec.Width, rec.Height);
                    if (first_save == false)
                    {
                        saveFileDialog1.Filter = "Fichiers Images|*.jpg*; *.png; *.bmp";
                        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                        {
                            saveFileDialog1.InitialDirectory = saveFileDialog1.FileName;
                            panel1.DrawToBitmap(bmp, rec);
                            bmp.Save(saveFileDialog1.InitialDirectory);
                            first_save = true;
                        }
                    }
                    else
                    {
                        panel1.DrawToBitmap(bmp, rec);
                        bmp.Save(saveFileDialog1.InitialDirectory);
                    }
                }
            }
    Le first_save n'influence pas le fonctionnement.

    Voilà, est-ce que vous auriez une suggestion ou une solution pour ce problème ? J'ai cherché pas mal de temps sur le net mais sans trouver grand chose :/

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Peut-être en utilisant une PictureBox au lieu d'un Panel.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut
    Je viens de tester, le problème reste le même :/ il doit survenir au moment de la sauvegarde, je pense notamment au DrawToBitmap mais je ne trouve pas de doc qui m'explique cela plus en détail...

  4. #4
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 668
    Par défaut
    Bonjour,

    En fait , le rectangle que tu passes a DrawToBitmap() définit la ou sera dessiner le control , et non la ou sera pris la source du dessin.Ce qui explique le décalage que tu peux avoir.

    Essaye de faire ça en 2 temps :

    - Tu créer un bitmap de tout ton panel
    - Tu en créer un deuxieme qui est la portion que tu veux , comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                // Ici le bitmap de tout ton panel
                Bitmap bitmap = new Bitmap(panel1.Width, panel1.Height);
                panel1.DrawToBitmap(bitmap,panel1.Bounds); // Ici on dessine selon la position du panel , vu que tu la prends en compte dans le calcul de position de ton rectangle ,tu devrais tombé juste
     
                // Ici le bitmap qui aura la position et la taille de ton carré
                Bitmap newbitmap = (Bitmap)bitmap.Clone(rec, bitmap.PixelFormat);
                newbitmap.Save("D:\\TonImage.bmp");

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Par défaut
    Effectivement, cela résout le problème ! Néanmoins, il reste une zone blanche en haut à gauche du panel (bien qu'elle soit invisible) qui apparaît après la première sauvegarde et celle-ci gêne la création du rectangle faisant qu'on ne peux plus sauvegarder vers cette zone. Mais ce problème n'est pas très important, il suffit de déplacer suffisamment l'image et a sauvegarde fonctionne très bien.

    Donc voilà, mon problème est résolu merci beaucoup à toi

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/11/2011, 14h14
  2. Sauvegardes
    Par tastalian dans le forum DirectX
    Réponses: 12
    Dernier message: 15/10/2002, 02h30
  3. [ADO] Sauvegarde / lecture de recordset
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/09/2002, 17h54
  4. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 16h23
  5. [Kylix] Sauvegarde de donnée utilisateur....
    Par Eclypse dans le forum EDI
    Réponses: 1
    Dernier message: 11/05/2002, 18h21

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