Partage
  • Partager sur Facebook
  • Partager sur Twitter

Carrer de redimensionnement sur une picturebox

Sujet résolu
    18 août 2017 à 4:01:55

    Bonjour,

    Je voudrais que quand dans mon programme je met une photo de profil une fenetre apparait avec une PictureBox et un rectangle dessus. Le rectangle serait pour redimensionner l'image qu j'ai mis le rectangle serait de 100 par 100 pixel et il serais possible d'agrandir le rectangle par les coin mais la photo serais convertit en 100 par 100 pixel j'ai vraiment aucune idée si c'est possible en VB.NET j'ai fais de nombreuse recherche mais la plus part des résultats était pour faire une sélection sur la PictureBox et la redimensionner.

    Merci de votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      18 août 2017 à 16:06:53

      Salut, alors j'ai créer un projet car le sujet m’intéressait, est-ce que ce qu tu voudrais faire ressemblerait à ça :

      Ca lag un peut avec l'enregistrement :honte:, et j'ai pris une image au pif sur internet.

      • Partager sur Facebook
      • Partager sur Twitter

      Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

        18 août 2017 à 20:11:01

        Oui sa serait parfait c’est bien se que j’imaginait.
        • Partager sur Facebook
        • Partager sur Twitter
          19 août 2017 à 0:31:43

          Pour ce projet :

          2 formulaires, l'un qui contiendra l'image a recadré, et l'autre le rendu final, pourquoi 2 ? Car j'utilise la propriété BackGroundImage du 1er formulaire qui laissera un autre contrôle (picturebox) à une couleur transparent, ce qui correspond à celle du formulaire.

          Form1 :

          Donner la taille que l'on veut au formulaire, la photo de profile s'y remplira avec de préférence la propriété BackGroundImageLayout à Stretch, et la propriété BackGoundImage contient la photo de profile; ensuite placer une PictureBox à l'emplacement voulu sur ce formulaire, y mettre la propriété BackGroundColor à Transparent, et pour être aperçu, la propriété BorderStyle à FixedSingle. Rien de sorcier pour le moment, mais je préfère détaillé.

          Form2 :

          Juste placer une PictureBox de la même taille que l'autre PictureBox de la 1er form dans le formulaire.

          Pour ce qui est du code, tout ce passe dans la Form1 :

          A déclarer en globale :

              Private Declare Auto Function BitBlt Lib "gdi32.dll" (ByVal pHdc As IntPtr, ByVal iX As Integer, ByVal iY As Integer, ByVal iWidth As Integer, ByVal iHeight As Integer, ByVal pHdcSource As IntPtr, ByVal iXSource As Integer, ByVal iYSource As Integer, ByVal dw As System.Int32) As Boolean
              Private Const SRC As Integer = &HCC0020
              Dim x, y As Integer
              Dim newpoint As Point

          La fonction BitBlt fait appel a la librairie gdi32 et prenant plusieurs paramètres qui sont requis à l'enregistrement d'une image, ici du type BipMap, tu peux retrouver plus de détailles sur cela ici. L'utilisation de cette fonction requière une constante, enfin pas nécessaire mais c'est plus lisible et conventionnel, elle se nomme SRC, ligne 2. Les variables x, y et newpoint servent à la meus (Impératif présent du verbe Mouvoir (xD)) du rectangle de recadrement, la picturebox.

          Voici ses événement pour pouvoir bouger sous le mouvement de la souris :

          Private Sub PictureBox_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
                  x = Control.MousePosition.X - PictureBox1.Location.X
                  y = Control.MousePosition.Y - PictureBox1.Location.Y
              End Sub
          
              Private Sub PictureBox_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
                  If e.Button = Windows.Forms.MouseButtons.Left Then
                      newpoint = Control.MousePosition
                      newpoint.X -= (x)
                      newpoint.Y -= (y)
                      PictureBox1.Location = newpoint
                      ConvertPictureBox_BMP(PictureBox1, "ProfileFile")
                  End If
              End Sub

          Encore une fois, ce n'est pas difficile de faire ça, voici maintenant le plus compliqué, mais bon, je suis gentil je t'ais tout donné, comme maitre gims... (faudrais qu'j'arrête ces blagues à deux balles :p)

          Je ne vais pas t'expliqué ce code, ci dessus, il est simple a comprendre et tu trouve pleins d'exemple sur internet, néamoins, il contient un appel à la fonction 'ConvertPictureBox_BMP' que voici :

          Public Sub ConvertPictureBox_BMP(ByVal PictureBox As PictureBox, ByVal sFilePath As String)
                  PictureBox.Refresh()
                  PictureBox.Select()
                  Dim g As Graphics = PictureBox.CreateGraphics
                  Dim ibitMap As New Bitmap(PictureBox.ClientSize.Width, PictureBox.ClientSize.Height, g)
                  Dim iBitMap_gr As Graphics = Graphics.FromImage(ibitMap)
                  Dim iBitMap_hdc As IntPtr = iBitMap_gr.GetHdc
                  Dim me_hdc As IntPtr = g.GetHdc
                  BitBlt(iBitMap_hdc, 0, 0, PictureBox.ClientSize.Width, PictureBox.ClientSize.Height, me_hdc, 0, 0, SRC)
                  iBitMap_gr.ReleaseHdc(iBitMap_hdc)
                  If sFilePath = "" Then Exit Sub
                  ibitMap.Save(sFilePath + ".bmp")
                  Form2.PictureBox1.Image = ibitMap
              End Sub

          La fonction prend deux paramètres : La picturebox qui "encadre" l'élément à enregistrer, et qui sera donc le désultat du redimentionnement, et le chemins où nous voulons enregistrer cette image, ici j'ai juste mis son nom "ProfileFile", elle sera enregistrer là où s'éxecutera l'application sous ce nom.

          Ensuite, dans le code, on "raffréchi" et séléctionne la picturebox, et puis on déclare plusieurs variables qui serviront à la fonction BitBlt, regarde dans le lien ci-dessus énnoncé pour mieux comprendre.

          Ensuite, viens cette fameuse fonction, que j'ai déjà expliqué.

          Puis, l'enregistrement et l'affichage, qui se font seulement si le nom du fichier requi en paramètre n'est guère nul. Pas besoin de t'expliquer ces 3 dernières lignes je suppose.

          Voilà, c'est vrai qu'il y a quelques lag, c'est à cause de la fonction ConverPictureBox_BMP, qui doit a chaques fois que la PictureBox1 bouge de 1 pixel, doit réenregistrer un nouveau fichier image. Donc, une alternative, est d'appeler cette fonction dans un bouton "Save" ou encore "View Result", afin de ne pas trops tout surcharger.

          Voilà :) Pour ce qui est du redimentionnement de l'image, tu as dis que tu avais trouver ce qu'il fallait, donc bhas à toi maintenant :)

          -
          Edité par vanaur 22 août 2017 à 21:19:54

          • Partager sur Facebook
          • Partager sur Twitter

          Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

            19 août 2017 à 2:02:01

            Bon ça marche très merci beaucoup pour votre grande aide mais j'ai rencontrer un problèmes puisque je vais l'utiliser pour modifier la grandeur des avatar de profil il n'y auras pas seulement des photo Bitmap donc sa pourrait causer problemes
            • Partager sur Facebook
            • Partager sur Twitter
              19 août 2017 à 2:11:12

              Jnitech a écrit:

               il n'y auras pas seulement des photo Bitmap donc sa pourrait causer problèmes

              Regarde de ce côté ;)



              -
              Edité par vanaur 19 août 2017 à 2:12:57

              • Partager sur Facebook
              • Partager sur Twitter

              Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                19 août 2017 à 11:09:11

                Euh pourquoi tu utilises bitblt et pas graphics.drawimage ?
                • Partager sur Facebook
                • Partager sur Twitter
                ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                  19 août 2017 à 13:58:27

                  Certes, j'aurais pu, mais j'ai plus l'habitude d'utiliser BitBlt pour ce type de projet.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le meilleur moyen de prédire l'avenir, c'est de l'inventer | N'oubliez pas [résolu] et +1 | Excusez mon ôrtograffe, j'essaie de l'améliorer...

                    22 août 2017 à 21:16:07

                    Merci beaucoup sa fonctionne très bien.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Carrer de redimensionnement sur une picturebox

                    × 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