Vb.net Découper une image en gardant les dimension intacte

Résolu
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 - 2 oct. 2016 à 10:42
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 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

3 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 2/10/2016 à 13:00
bonjour
l'erreur est au niveau de cette ligne à mon avis
 gr.DrawImage(img, rect, 0, (300 * c), 900, (300 * (1 + c)), GraphicsUnit.Pixel)


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

la nouvelle ligne
gr.DrawImage(img, rect, 0, (300 * c), 900, 300, GraphicsUnit.Pixel)


Le code complet


Imports System.IO

Public Class Form1

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. 
1
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
Modifié par kikou93 le 2/10/2016 à 12:42
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
2 oct. 2016 à 11:49
Bonjour

mais le problème et ça ne découpe pas bien

c'est peut etre le


explique un peu plus
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
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 :


0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
2 oct. 2016 à 12:58
Oui je n'avais pas bien lu

un bonjour à vb95
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019
2 oct. 2016 à 13:07
merci cs_ShayW
toi de même
0
Rejoignez-nous