Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le paramètre n'est pas valide

Sujet résolu
    4 mai 2021 à 14:55:16

    Bonjour, j'essaie de vérifier la l'image1 passé en paramètre est la même que image2, si oui la supprimé sinon la garder, mais le problème est que j'obtiens une erreur quand j'appuie sur le bouton. Voici mon code:
    private static byte[] RGBValues(Bitmap p_bmp)
            {
                // Lock the bitmap's bits.
                Rectangle rect = new Rectangle(0, 0, p_bmp.Width, p_bmp.Height);
                System.Drawing.Imaging.BitmapData bmpData =
                    p_bmp.LockBits(rect, ImageLockMode.ReadWrite,
                    p_bmp.PixelFormat);
    
                // Get the address of the first line.
                IntPtr ptr = bmpData.Scan0;
    
                // Declare an array to hold the bytes of the bitmap.
                int bytes = bmpData.Stride * p_bmp.Height;
                byte[] rgbValues = new byte[bytes];
    
                Marshal.Copy(ptr, rgbValues, 0, bytes);
    
                // Unlock the bits.
                p_bmp.UnlockBits(bmpData);
    
                return rgbValues;
            }
    
            public bool imagePareil(Bitmap p_bmp1, Bitmap p_bmp2)
            {
                byte[] bits1 = RGBValues(p_bmp1);
                byte[] bits2 = RGBValues(p_bmp2);
    
                int bitsLength = bits1.Length;
                int bitsLength2 = bits2.Length;
    
                if (bitsLength != bitsLength2)
                    return false;
                for (int i = 0; i != bitsLength; i++)
                {
                    if (bits1[i] != bits2[i])
                    {
                        return false;
                    }
                }
                return true;
            }
    
    private void deleteDenialButton_Click(object sender, EventArgs e)
            {
                if (Directory.Exists(PATHIMAGES))
                {
                    string[] getFiles = Directory.GetFiles(PATHIMAGES);
                    string fileDenialList = PATHDENIAL + "denial-list.txt";
                    string[] getImages = File.ReadAllLines(fileDenialList);
                    Bitmap bitmap1 = null, bitmap2 = null;
    
                    foreach (string file in getFiles)
                    {
                        if (file != string.Empty)
                        {
                            bitmap1 = new Bitmap(file);
                            for (int i = 0; i < getImages.Length; i++)
                            {
                                string denialImage = PATHDENIAL + getImages[i];
                                bitmap2 = new Bitmap(denialImage);
                                try
                                {
                                    if (EXTRA.imagePareil(bitmap1, bitmap2) == true)
                                    {
                                        bitmap1.Dispose();
                                        bitmap2.Dispose();
                                        try
                                        {
                                            File.Delete(file);
                                        }
                                        catch (System.IO.IOException a) { MessageBox.Show(a.Message + "\n\nStackTrace : " + a.StackTrace + "\n\nInnerException :" + a.InnerException); }
                                    }
                                }
                                catch (System.IO.IOException a) { MessageBox.Show(a.Message + "\n\nStackTrace : " + a.StackTrace + "\n\nInnerException :" + a.InnerException); }
                            }
                        }                     
                    }
                    bitmap1.Dispose();
                    bitmap2.Dispose();
                }
            }
    J'ai ajouté un breakpoint là où ça plante
    Rectangle rect = new Rectangle(0, 0, p_bmp.Width, p_bmp.Height);

    Et j'obtiens des paramètres à 0 ou null, je comprend vraiment pas pourquoi, puisque ça me supprime bien l'image mais l'erreur apparait quand même.

    Merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2021 à 15:15:36

      Que valent "p_bmp.Width" et "p_bmp.Height" ?
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        4 mai 2021 à 20:49:18

        Merci pour ton aide!

        Un screen pour montrer que p_bmp est bien initialisé

        • Partager sur Facebook
        • Partager sur Twitter
          4 mai 2021 à 21:10:39

          Que valent "p_bmp.Width" et "p_bmp.Height" ? (BIS)

          >Un screen pour montrer que p_bmp est bien initialisé

          Il montre juste qu'il a bien un certain type, pas que les valeurs de ses champs ait une valeur qui aurait un sens en tant que paramètre du constructeur de Rectangle.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            4 mai 2021 à 21:35:29

            bacelar a écrit:

            Que valent "p_bmp.Width" et "p_bmp.Height" ? (BIS)

            >Un screen pour montrer que p_bmp est bien initialisé

            Il montre juste qu'il a bien un certain type, pas que les valeurs de ses champs ait une valeur qui aurait un sens en tant que paramètre du constructeur de Rectangle.


            Eh bien oui, il y a écrit dans la case " size " 319 width 60 height

            • Partager sur Facebook
            • Partager sur Twitter
              5 mai 2021 à 2:04:00

              Arrêtez vos cochonneries de MessageBox et utilisez correctement le débogueur.

              >Et j'obtiens des paramètres à 0 ou null,

              Alors, ils sont où ces 0 et autre null ???

              Message d'erreur + numéro de ligne où ça plante + type de l'exception + callstack dans l'exception, etc...

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                5 mai 2021 à 2:30:27

                Doucement.. Oui je veux bien mais comment on fait ?
                • Partager sur Facebook
                • Partager sur Twitter
                  5 mai 2021 à 2:43:39

                  Pour ce qui est des valeurs lors du debugging, les fenêtres "Watch/Espion" permettent d'évaluer n'importe quelle expression, donc les valeurs de champs d'un paramètre d'une méthode, sans problème. Mais on peut utiliser les flèches à gauche des expressions (aussi bien dans la fenêtre "Variables locales" qu'une fenêtre "Espion") pour voir les valeurs de leurs champs publiques.

                  Pour le message d'erreur ? Bin donnez ce qui s'affiche à l'écran.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    5 mai 2021 à 21:36:44

                    Merci vraiment d'essayer de m'aider mais j'ai jamais appris à debug une app du coup, est-ce ces informations dont vous parlez ?

                    System.ArgumentException
                      HResult=0x80070057
                      Message=Le paramètre n'est pas valide.
                      Source=System.Drawing
                      Arborescence des appels de procédure :
                       à System.Drawing.Image.get_Width()
                       à Lightshot.extras.RGBValues(Bitmap p_bmp) dans C:\Users\jm\Desktop\lightshot\Lightshot\extras.cs :ligne 43
                       à Lightshot.extras.imagePareil(Bitmap p_bmp1, Bitmap p_bmp2) dans C:\Users\jm\Desktop\lightshot\Lightshot\extras.cs :ligne 65
                       à Lightshot.Form1.deleteDenialButton_Click(Object sender, EventArgs e) dans C:\Users\jm\Desktop\lightshot\Lightshot\Form1.cs :ligne 393
                       à System.Windows.Forms.Control.OnClick(EventArgs e)
                       à System.Windows.Forms.Button.OnClick(EventArgs e)
                       à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
                       à MetroFramework.Controls.MetroButton.OnMouseUp(MouseEventArgs e)
                       à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
                       à System.Windows.Forms.Control.WndProc(Message& m)
                       à System.Windows.Forms.ButtonBase.WndProc(Message& m)
                       à System.Windows.Forms.Button.WndProc(Message& m)
                       à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
                       à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
                       à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
                       à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
                       à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
                       à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
                       à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
                       à System.Windows.Forms.Application.Run(Form mainForm)
                       à Lightshot.Program.Main() dans C:\Users\jm\Desktop\lightshot\Lightshot\Program.cs :ligne 19





                    -
                    Edité par hugoducine 5 mai 2021 à 21:48:10

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 mai 2021 à 13:46:44

                      @hugoducine Bonjour, je viens de sortir votre dernier message des spams, si cela arrive encore vous pouvez poster dans ce sujet Si votre message est considéré comme spam

                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 mai 2021 à 14:04:16

                        >à Lightshot.extras.RGBValues(Bitmap p_bmp) dans C:\Users\jm\Desktop\lightshot\Lightshot\extras.cs :ligne 43

                        C'est la ligne 7 du message d'erreur.

                        Il parle de la ligne 43 mais dans vos copies d'écran cela semble venir de la ligne 42.

                        Vous avez fait des modifications entre temps ?

                        La Ligne 6 du message d'erreur montre que c'est en essayant de récupérer la largeur de l'image qu'elle se rend compte que c'est tout pourrie.

                        Vous l'avez initialisé comment votre "p_bmp" (et la notation hongroise, ça pue du cul, et encore plus avec des "p_" qui ne veulent rien dire en .NET) ?

                        Si vous "dépliez" (via la petite flèche) "p_bmp" dans la fenêtre des "Variables locales", vous devriez voir ce qui est correctement initialisé dans votre objet et ce qu'il ne l'est pas.

                        Le problème n'est pas dans la méthode "RGBValues" mais ce que vous lui donnez en paramètre.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                          6 mai 2021 à 15:46:06

                          Ton erreur doit venir du venir que tu libères bitmap1 en ligne 66 du code de ton premier post (et que tu supprimes le fichier), quand tu as 2 images identiques, et vu que tu ne sors pas de la boucle for (ligne 58), au tour suivant, bitmap est Nothing et donc le paramètre width ou height n'existe pas.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 mai 2021 à 19:59:04

                            >Sans avoir lu vos post, car entre temps j'avais chercher partout pour avoir des réponses mais j'ai vu qu'avec un break; en dessous de file.delete cela fonctionnait, Mais la cela demander beaucoup trop de temps pour l'application ce qui bouffait la mémoire et avec un Application.DoEvents, cela fonctionnait parfaitement. Maintenant j'ai vu que Application.DoEvent était à bannir et qu'il fallait mieux privilégier un BackgroundWorker ainsi qu'un Thread.

                            EDIT: @umfred Oui voilà c'est exactement ça. Merci @bacelar j'ai vu un peu comprendre comment se servir du debugger grâce à vous. Merci je met en résolu

                            -
                            Edité par hugoducine 6 mai 2021 à 20:12:25

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Le paramètre n'est pas valide

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown