Vb.net Découper une image en gardant les dimension intacte [Résolu]

kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 2 oct. 2016 à 10:42 - Dernière réponse : vb95 1696 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 novembre 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
vb95 1696 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 novembre 2018 Dernière intervention - Modifié par vb95 le 2/10/2016 à 13:00
1
Merci
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. 

Merci vb95 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 2 oct. 2016 à 12:41
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
Commenter la réponse de vb95
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 2 oct. 2016 à 11:49
0
Merci
Bonjour

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

c'est peut etre le


explique un peu plus
Commenter la réponse de cs_ShayW
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 2 oct. 2016 à 12:26
0
Merci
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 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 2 oct. 2016 à 12:58
Oui je n'avais pas bien lu

un bonjour à vb95
vb95 1696 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 12 novembre 2018 Dernière intervention > cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 2 oct. 2016 à 13:07
merci cs_ShayW
toi de même
Commenter la réponse de kikou93

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.