kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 2018
-
2 oct. 2016 à 10:42
vb95
Messages postés3441Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention 3 décembre 2023
-
2 oct. 2016 à 13:07
Bonjour,
Aprés un certain nombre de recherche j'ai pu créer le code que je voulais (enfin à peu près)
ce code me permet de découper une image d'une taille (900 x 900 ) en 3 images de taille (900 x 300) (pour l'instant j'ai fixé les dimensions de l'image originale à 900 x 900)
mais le problème et ça ne découpe pas bien, j'ai beau chercher je ne trouve pas où est l'erreur
Voici le code :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click OpenFileDialog1.Multiselect = False OpenFileDialog1.Title = "Choisissez une image" OpenFileDialog1.Filter = "jpeg (*.jpg)|*.jpg|gif (*.gif)|*.gif|tiff (*.tif)|*.tif|bmp (*.bmp)|*.bmp|png (*.png)|*.png" OpenFileDialog1.FilterIndex = 1 OpenFileDialog1.RestoreDirectory = False If OpenFileDialog1.ShowDialog = DialogResult.OK Then chemin = OpenFileDialog1.FileName 'chemin image source Using monstream As New IO.FileStream(chemin, IO.FileMode.Open, FileAccess.Read) PictureBox1.Image = Image.FromStream(monstream) img = Image.FromStream(monstream) filename = System.IO.Path.GetFileNameWithoutExtension(chemin) ext = System.IO.Path.GetExtension(chemin) chemain_dossier_source = chemin.Replace(chemin.Substring(chemin.LastIndexOf("\")), "") End Using For c As Integer = 0 To 2 Dim bm As New Bitmap(900, 300) Dim gr As Graphics = Graphics.FromImage(bm) Dim rect As New Rectangle(0, 0, 900, 300) gr.DrawImage(img, rect, 0, (300 * c), 900, (300 * (1 + c)), GraphicsUnit.Pixel) chemin1 = chemain_dossier_source & "\" & filename & " Découper " & c & ext bm.Save(chemin1, System.Drawing.Imaging.ImageFormat.Jpeg) bm.Dispose() If c = 2 Then Exit For End If Next Else MessageBox.Show("Opération annulée par l'utilisateur!", "Ouverture image", MessageBoxButtons.OK, MessageBoxIcon.Information) Exit Sub End If End Sub
Voici un exemple :
une image du Nom "Nature" de dimension (900 x 900), après l'avoir découper :
Nature découper 0 :
Nature découper 1 :
Nature découper 2 :
aidez-moi s'il vous plaît
et merci pour votre future aide, Merci
vb95
Messages postés3441Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention 3 décembre 2023165 Modifié par vb95 le 2/10/2016 à 13:00
bonjour
l'erreur est au niveau de cette ligne à mon avis
le sixième paramètre de DrawImage est la hauteur de l'image de destination et elle est constante : 300 et non (300 * (1 +c)) . Sinon l'image destination se tasse
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
With OpenFileDialog1 .Multiselect = False .Title = "Choisissez une image" .Filter = "jpeg (*.jpg)|*.jpg|gif (*.gif)|*.gif|tiff (*.tif)|*.tif|bmp (*.bmp)|*.bmp|png (*.png)|*.png" .FilterIndex = 1 .RestoreDirectory = False If .ShowDialog = DialogResult.OK Then Using monstream As New FileStream(.FileName, FileMode.Open, FileAccess.Read) PictureBox1.Image = Image.FromStream(monstream) For i = 0 To 2 Dim bm As New Bitmap(900, 300) Dim gr As Graphics = Graphics.FromImage(bm) gr.DrawImage(PictureBox1.Image, New Rectangle(0, 0, 900, 300), 0, (300 * i), 900, 300, GraphicsUnit.Pixel) Dim fichier As String = Path.GetDirectoryName(.FileName) & "\" & Path.GetFileNameWithoutExtension(.FileName) & " Découper " & i.ToString & Path.GetExtension(.FileName) bm.Save(fichier, Imaging.ImageFormat.Jpeg) bm.Dispose() Next End Using Else MessageBox.Show("Opération annulée par l'utilisateur!", "Ouverture image", MessageBoxButtons.OK, MessageBoxIcon.Information) Exit Sub End If End With
End Sub
End Class
- utilisation de With .............. End With qui évite les répétitions de OpenfileDialog
- Import de System.IO en haut de la feuille : évite de le spécifier dans le code
- utilisation directe des propriétés de System.IO.Path pour générer le nom du fichier découpé ( inutile de créer des variables supplémentaires)
- attention : tu mélanges parfois le répertoire d'un fichier ( son chemin) avec son nom complet
- pour les variables de boucle For on utilise plutôt i et j comme nom de variable ( et inutile de les déclarer en Integer en plus)
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
a oui ça marche merci
je croyais que ( 0, (300 * c)) été les coordonnées du point haut gauche et que (900, (300 * (1 + c))) été les coordonnées du point bas droit de chaque image découper
maintenant ça marche même si je la coupe en 9 partie
Merci vb95
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 20181 2 oct. 2016 à 12:26
Merci de m'avoir répondu
Désolé, je croyais que les images expliqué bien la situation, je vais essais de mieux expliquer
Quand en découpe l'image en 3 partie
La première partie (Nom : Nature découper 0)
On prend la partie " de (0,0) jusqu'à (900,300) "
La deuxième partie (Nom : Nature découper 1)
On prend la partie " de (0,300) jusqu'à (900,600) "
La Troisième partie (Nom : Nature découper 2)
On prend la partie " de (0,600) jusqu'à (900,900) "
Comme le montre l'image suivante :
Ce que je veux dire est que le résultat doit être comme ça :
et pas comme ça :
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 2 oct. 2016 à 12:58
Oui je n'avais pas bien lu
un bonjour à vb95
vb95
Messages postés3441Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention 3 décembre 2023165
>
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 2019 2 oct. 2016 à 13:07
Modifié par kikou93 le 2/10/2016 à 12:42
je croyais que ( 0, (300 * c)) été les coordonnées du point haut gauche et que (900, (300 * (1 + c))) été les coordonnées du point bas droit de chaque image découper
maintenant ça marche même si je la coupe en 9 partie
Merci vb95