Decouper ou rogner une image

Résolu
DAN - 12 oct. 2016 à 12:23
DAN247
Messages postés
37
Date d'inscription
samedi 29 octobre 2016
Statut
Membre
Dernière intervention
31 mai 2019
- 29 oct. 2016 à 19:29
Bonjour à tous.
Je m'inspire d'un code que j'ai récupéré sur ce site sans me souvenir précisément de son créateur mais il s'agit de :
ImageCroppingDemo
ce code fonctionne bien, il s'agit de découper une partie de l'image pour la récupérer et l'enregistrer.
Malheureusement l'image récupérait reste déformé et tiré et je ne parviens pas à trouver la solution. L'instruction « PreviewPictureBox.SizeMode = PictureBoxSizeMode.Zoom
» ne fonctionne pas dans ce cas

si vous pouviez m'indiquer la méthode pour que la nouvelle image obtenue reste dans les proportions sans aucune déformation je vous en serais vraiment très reconnaissant car je tourne en rond depuis une semaine.
D'avance je vous en remercie.


Voici le code concernant la récupération de la partie découpée de l'image :


Private Sub crobPictureBox_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseUp
Try
Cursor = Cursors.Default
Try

If cropWidth < 1 Then
Exit Sub
End If

Dim rect As Rectangle = New Rectangle(cropX, cropY, cropWidth, cropHeight)
Dim bit As Bitmap = New Bitmap(crobPictureBox.Image, crobPictureBox.Width, crobPictureBox.Height)

cropBitmap = New Bitmap(cropWidth, cropHeight)
Dim g As Graphics = Graphics.FromImage(cropBitmap)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g.DrawImage(bit, 0, 0, rect, GraphicsUnit.Pixel)
'pour ajuster l'image
PreviewPictureBox.SizeMode = PictureBoxSizeMode.Zoom


PreviewPictureBox.Image = cropBitmap

Catch exc As Exception
End Try
Catch exc As Exception
End Try
End Sub

13 réponses

cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
12 oct. 2016 à 13:27
0
Bonjour pour cette réponse mais ca ne marche pas chez moi
recadr_img.exe est manquant.


Je parviens bien a decouper une partie de ma picture box et la coller dans une seconde picture box mais cette dernière reste déformée étirée....

auriez vous une solution?
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
13 oct. 2016 à 18:50
recadr_img.exe est manquant.

Toutes les sources sont déposées sans exe, c'est la règle, il suffit d'ouvrir la solution et la compiler!
0
Merci mais je suis assez novice en la matiere pourriez vous me preciser la marche a suivre,je ne vois pas ou se trouve ce fichier que je dois ouvrir et si je dois le renomer
Excuser mon ignorance
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
Modifié par vb95 le 14/10/2016 à 00:41
bonsoir
Tu dis que tu t"es inspiré d'un code présent sur le site et que tu l'as même essayé : donc tu manipules un projet sans savoir sur quoi tu agis !
Il serait plus que temps d'apprendre ce qu'est un projet et une solution VB Net, de quels fichiers ceci est constitué ainsi que le rôle de chaque type de fichiers et quelles sont les bases du langage VB Net .
Ensuite tu pourras espérer voler de tes propres ailes sur le chemin de la programmation
Un excellent cours bien qu'il date un peu : http://plasserre.developpez.com/cours/vb-net/
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
14 oct. 2016 à 08:14
Salut vb95, je suis moi même étonné de la question, car voici un post qui date de 2014!

http://codes-sources.commentcamarche.net/forum/affich-10040578-progresbare-qui-bloque
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022

14 oct. 2016 à 15:52
un salut amical à cs_Le Pivert
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour.
Vous êtes un peu sévère avec moi, je programme de façon correcte en m'inspirant parfois du code de de certains.
Sur cette simple petite partie consistant à récupérer une partie de l'image d'une Picture box je n'obtient pas à l'arrivée un résultat correct car cette parcelle reste déformée.
Je ne programme pas régulièrement et j'ai suivi régulièrement un didacticiel visuel basique sur ce site il y a quelques années.
Cela ne fait pas de moi un pro de la programmation VB.
C'est bien pour cela que je m'adresse aux pros de ce site qui pourrait me donner la solution.
J'ajoute qu'étant malvoyant je ne peux pas aller chercher sur le Web
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
14 oct. 2016 à 10:54
Nous ne sommes pas sévères, mais tu comprendras que ta question peut surprendre de la part d'une personne qui programme en VB.Net
voici le fichier à ouvrir:recad_img


0
Bonsoir.
J'ai réglé mon problème mais je ne parviens pa a lancer ton appli sous vb.net 2010 ou mémé vb.net 2015
J'ai bien ouvert et visualisé le code mais j'ai le message d'erreur lorse que je veux ouvrir la le désigne ou le lancer.
Je voulais t'envoyer une copie d’écran mais le bouton inserer une image ne me donne pas cette possibilité.

Pourtant je n'ai pas de souci avec le téléchargement des autres codes.....
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
14 oct. 2016 à 19:39
Bonsoir
Le projet que t'a fourni cs_Le Pivert fonctionne très bien sous Visual Studio 2015 que j'ai moi-même
Tu as un message d'erreur oui mais lequel ? On peut pas deviner
Dans quelles conditions l'as-tu ce message d'erreur ?
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129 > vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022

14 oct. 2016 à 20:37
Pour ce qui t’intéresse, regarde cela:

#Region "Aperçu recadrage"
    Private Sub btnrogner_Click(sender As System.Object, e As System.EventArgs) Handles btnrogner.Click
        If pic.Image Is Nothing Then Exit Sub
        Dim r As RectangleF = RegionToPixels()
        Dim bm As New Bitmap(CInt(r.Width), CInt(r.Height), pic.Image.PixelFormat)
        Dim rDest As New RectangleF(0, 0, r.Width, r.Height)
        Dim g As Graphics = Graphics.FromImage(bm)
        g.DrawImage(pic.Image, rDest, r, GraphicsUnit.Pixel)
        g.Dispose()
        Result.picresult.Image = bm
        Result.picresult.Width = CInt(r.Width)
        Result.picresult.Height = CInt(r.Height)
        Result.Width = CInt(r.Width)
        Result.Height = CInt(r.Height)
        Result.ShowDialog()
        bm.Dispose()
    End Sub
#End Region


car il ne suffit pas de faire :

PreviewPictureBox.SizeMode = PictureBoxSizeMode.Zoom 

pour ajuster l'image.

dans mon code Result est un form dans lequel il y a une Picturebox nommée: picresult
ensuite adapte tes variables au code.

Bon courage

@+ Le Pivert
0
Dan1 > cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022

14 oct. 2016 à 23:35
Grand merci pour le code
Je vais regarder ca de plus prêt et te dirai si cela corespond a mes besoins
Reconnais que c'est un sujet un peut pointu bien loin d'un simple afichage
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129 > Dan1
15 oct. 2016 à 07:42
Le principe est de mettre ta PictureBox aux dimensions de ton image recadrée et non pas le contraire pour avoir une image non déformée . C'est ce que fait ce code!

@+ Le Pivert
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129 > cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022

15 oct. 2016 à 12:04
Voici un code tout simple avec les commentaires
2 PictureBox et un Button:

Option Strict On
Public Class Form1
    Dim fileName As String = "C:\chemin image.jpg" 'adapter le chemin d'ouverture
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Image = Image.FromFile(fileName) 'image originale PictureBox1
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim rect As Rectangle = New Rectangle(50, 50, 100, 100) ' positions x, y et dimensions largeur, hauteur du rectangle rogné dans la PictureBox1
        Dim bit As Bitmap = New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
        Dim CropImage = New Bitmap(100, 100) 'dimension du bitmap 
        Dim g As Graphics = Graphics.FromImage(CropImage)
        g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
        g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
        g.DrawImage(bit, 0, 0, rect, GraphicsUnit.Pixel)
        PictureBox2.Image = CropImage 'affichage dans la PictureBox2 aux dimensions du rectangle rogné
        CropImage.Save("C:\chemin monimage.jpg", Imaging.ImageFormat.Jpeg) 'adapter le chemin d'enregistrement
    End Sub
End Class
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
Modifié par cs_Le Pivert le 16/10/2016 à 18:07
Bravo vb95, le résultat est conforme à la sélection, voir la mire à ouvrir dans le programme:


télécharger sur le net: code barre, très utile!

merci,c'est vrai le programme dont tu parles est fait sur la base du programme que DAN1 n'arrive pas à faire fonctionner, c'est dommage car là tu as un rectangle de sélection réglable comme les logiciel de pro.

Bonne soirèe
@+ Le Pivert
0
Bonsoir.
Je pense que l'option StretchImage ne peut convenir car
L'image contenue dans la PictureBox est étirée ou rétrécie pour correspondre à la taille de la PictureBox..
Il faudrait pouvoir utiliser l'option zoom et obtenir en sortie une image correspondant à la sélection avec également une option zoom.
Le problème est forcément la et je ne sais toujours pas comment procéder.
Il faudrait pouvoir recalculer la hauteur et la largeur de la nouvelle image mais celle mémorisée dans le cadre n'est pas correcte non plus…

qu'en penses-tu ?
PS : je vais être obligé de recréer un nouveau pseudo et un nouveau mot de passe car celui que j'avais précédemment ne semble plus fonctionner car je ne l'ai pas utilisé depuis très longtemps.
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
Modifié par vb95 le 17/10/2016 à 01:22
Salut Dan
Je crois avoir trouvé
Utilises ce code S.V.P et uniquement celui-ci

Imports System.Drawing.Drawing2D

Public Class Form1

Dim Yend As Integer
Dim Xend As Integer
Dim Ystart As Integer
Dim Xstart As Integer
Dim cropWidth As Integer
Dim cropHeight As Integer
Dim cropBitmap As Bitmap
Public cropPen As Pen
Public cropPenSize As Integer = 1 'epaisseur du trait de cadre
Public cropDashStyle As Drawing2D.DashStyle = Drawing2D.DashStyle.Solid ' spefie une ligne continue
Public cropPenColor As Color = Color.Yellow 'specifie la couleur du trait

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
PictureBox2.SizeMode = PictureBoxSizeMode.Normal
PictureBox2.Visible = False
Dim nomfich As String = "D:\Capture.jpg" ' fichier image à charger
PictureBox1.Image = Image.FromFile(nomfich)

End Sub

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

If PictureBox1.Image Is Nothing Then Exit Sub
If e.Button = MouseButtons.Left Then
PictureBox1.Refresh()
PictureBox2.Visible = False
Xstart = e.X
Ystart = e.Y
End If

End Sub

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

If PictureBox1.Image Is Nothing Then Exit Sub
If e.Button = MouseButtons.Left Then
PictureBox1.Refresh()
Yend = e.Y
Xend = e.X
cropWidth = Math.Abs(e.X - Xstart)
cropHeight = Math.Abs(e.Y - Ystart)
cropPen = New Pen(cropPenColor, cropPenSize)
'On efface l'ancien rectangle
Dim rect As Rectangle
ControlPaint.DrawReversibleFrame(rect, Me.BackColor, FrameStyle.Thick)
rect = PictureBox1.RectangleToScreen(New Rectangle(Xstart, Ystart, Xend - Xstart, Yend - Ystart))
PictureBox1.CreateGraphics.DrawRectangle(cropPen, Xstart, Ystart, cropWidth, cropHeight)
End If

End Sub

Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

If PictureBox1.Image Is Nothing Then Exit Sub
If cropHeight = 0 Or cropWidth = 0 Then Exit Sub
PictureBox1.CreateGraphics.DrawRectangle(cropPen, Xstart, Ystart, cropWidth, cropHeight)
Dim rect As Rectangle = New Rectangle(Xstart, Ystart, Xend - Xstart, Yend - Ystart)
' positions x, y et dimensions largeur, hauteur du rectangle rogné dans la PictureBox1
Dim bit As Bitmap = New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
Dim CropImage = New Bitmap(cropWidth, cropHeight) 'dimension du bitmap
Dim g As Graphics = Graphics.FromImage(CropImage)
g.InterpolationMode = InterpolationMode.HighQualityBicubic
g.PixelOffsetMode = PixelOffsetMode.HighQuality
g.CompositingQuality = CompositingQuality.HighQuality
g.DrawImage(bit, 0, 0, rect, GraphicsUnit.Pixel)
PictureBox2.Height = rect.Height
PictureBox2.Width = rect.Width
PictureBox2.Image = CropImage 'affichage dans la PictureBox2 aux dimensions du rectangle rogné
PictureBox2.Visible = True

End Sub

End Class


Deux modifications ont été faites
1) Le SizeMode de PictureBox1 est sur Autosize et non sur StretchImage ce qui fait que PictureBox1 s'adapte automatiquement aux dimensions du fichier image stocké sur le disque : donc plus d'image étirée ou rétrécie normalement .
2) Par contre pour Picturebox2 on passe ce paramètre à Normal

Remplace le nom du fichier Image que moi j'ai mis par le nom de ton fichier Image
Dis nous ce qu'il est est
A +
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
17 oct. 2016 à 04:43
Bonjour, VB95
Oui : toujours travailler sur l'image, telle qu'elle est (sans aucun étirement) ou encore via un objet stdpicture.
Rien n'interdit ensuite, si on le souhaite, d'appliquer au résultat (la portion copiée) un coefficient réducteur ou agrandisseur identique (un zoom) aux deux dimensions.
.
0
DAN1 > ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018

17 oct. 2016 à 10:49
Bonjour.
J'ai aussitôt testé ton code.
Je pense que cela fonctionne mais je n'ai pas la totalité de ma photo sur l'écran ce qui fait que je ne peux pas choisir tel ou tel parti de cette image.
Je pense qu'il faut partir de l'option zoom et qu'il doit y avoir un moyen de redimensionner la photo obtenue mais comment ?
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129 > DAN1
17 oct. 2016 à 10:51
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
17 oct. 2016 à 11:25
On est en train de tourner en rond. Voici le programme indiqué au départ avec l'exe. Tu télécharges, tu dezippes et ensuite tu vas dans le dossier Debug et tu cliques sur le fichier: recad_img avec l'icone en forme de ciseaux.
Là tu auras ce que tu veux, car les proportions sont prises en compte, grâce à la class clsRegion qui gère tout.

http://www.cjoint.com/c/FJrjugYdgrQ

Bon courage

@+ Le Pivert
0
DAN1 > cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022

17 oct. 2016 à 18:38
Bonsoir.
Je pense avoir trouvé la solution, cela marche maintenant chez moi avec quelques petites corrections à faire par la suite.
J'ai ajouté trois petits contrôles, un pour lire la photo une seconde pour l'enregistrer une troisième pour effacer.
Voici mon code.
Imports System.Drawing.Drawing2D

Public Class Form1
Dim Monimage, Monimage_mini As System.Drawing.Image
Dim fichier_image As String
Dim Yend As Integer
Dim Xend As Integer
Dim Ystart As Integer
Dim Xstart As Integer
Dim cropWidth As Integer
Dim cropHeight As Integer
Dim cropBitmap As Bitmap
Public cropPen As Pen
Public cropPenSize As Integer = 2 'epaisseur du trai de cadre
Public cropDashStyle As Drawing2D.DashStyle = Drawing2D.DashStyle.Solid ' spefie une ligne continue
Public cropPenColor As Color = Color.Yellow 'spefie la couleur du trai
Dim Hpic
Dim pbL, pbH, pbTop, pbLeft As Integer
Dim rect As Rectangle
Dim Lpic
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Exit Sub
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
PictureBox2.SizeMode = PictureBoxSizeMode.Zoom

' Dim NOM = "d:\chemin monimage.jpg"
' Dim NOM = "E:\VBNET2012Z4\bin\Debug\DATA\PHOTO\2005.JPG"

Dim NOM = "E:\VBNET2012Z4\bin\Debug\DATA\PHOTO\2009.JPG"
Monimage = System.Drawing.Bitmap.FromFile(NOM)


Dim fs As System.IO.FileStream
' Specify a valid picture file path on your computer.
fs = New System.IO.FileStream(NOM, IO.FileMode.Open, IO.FileAccess.Read)
'pour ajuster l'image
PictureBox1.Image = System.Drawing.Image.FromStream(fs)

fs.Close()
fs.Dispose()
fs = Nothing
' PictureBox2.Image = RognImage(PictureBox1.Image, 900, 900, 400, 400)

'vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Lpic = PictureBox2.Width
Lpic = PictureBox2.Height

'= New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
cropBitmap = New Bitmap(15000, 600)
'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
' dessiner cadre
Dim graph As Graphics = Graphics.FromImage(cropBitmap)
Dim rect As New Rectangle(0, 0, cropWidth, cropHeight)
cropPen = New Pen(cropPenColor, cropPenSize)

PictureBox1.CreateGraphics.DrawRectangle(cropPen, 10, 10, 20, 20)
'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

PictureBox2.Image = (cropBitmap)
' PictureBox2.Height = PictureBox2.Height
' PictureBox2.Width = PictureBox2.Width / 2
Exit Sub

End Sub
Private Function RognImage(ByVal ImaSource As Bitmap, ByVal xPixelDep As Int32, ByVal yPixelDep As Int32, ByVal xPixelTotal As Int32, ByVal yPixelTotal As Int32) As Bitmap


'ATTENTION: Pour le rendu final de votre control PictureBox, souvenez vous que la propriété SizeMode
'influence la manière dont le controle et son contenu image est dessiné. Garder à l'esprit que le rognage
's effectue sur l'objet image contenu dans le PictureBox et non sur le contrôle PictureBox lui même.
'
'Vous pouvez appliquer la fonction à tout objet image et pas seulement au contrôle PictureBox.

Dim nouvImage As New Bitmap(xPixelTotal, yPixelTotal)
Dim graph As Graphics = Graphics.FromImage(nouvImage)
Dim rect As New Rectangle(0, 0, xPixelTotal, yPixelTotal)
graph.DrawImage(ImaSource, rect, xPixelDep, yPixelDep, xPixelTotal, yPixelTotal, GraphicsUnit.Pixel)
Return nouvImage

End Function




Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
'If PictureBox1.Image Is Nothing Then Exit Sub
' If e.Button = Windows.Forms.MouseButtons.Left Then
PictureBox1.Refresh()
Xstart = e.X
Ystart = e.Y
End If
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If PictureBox1.Image Is Nothing Then Exit Sub

If e.Button = Windows.Forms.MouseButtons.Left Then


PictureBox1.Refresh()
Yend = e.Y
Xend = e.X

cropWidth = Math.Abs(e.X - Xstart)
cropHeight = Math.Abs(e.Y - Ystart)
cropPen = New Pen(cropPenColor, cropPenSize)
' PictureBox1.CreateGraphics.DrawRectangle(cropPen, Xstart, Ystart, cropWidth, cropHeight)

'On efface l'ancien rectangle

' ControlPaint.DrawReversibleFrame(rect, Me.BackColor, FrameStyle.Thick)
rect = PictureBox1.RectangleToScreen(New Rectangle(Xstart, Ystart, Xend - Xstart, Yend - Ystart))

PictureBox1.CreateGraphics.DrawRectangle(cropPen, Xstart, Ystart, cropWidth, cropHeight)

End If

End Sub

Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

PictureBox1.CreateGraphics.DrawRectangle(cropPen, Xstart, Ystart, cropWidth, cropHeight)
Dim rect As Rectangle = New Rectangle(Xstart, Ystart, Xend - Xstart, Yend - Ystart)
' positions x, y et dimensions largeur, hauteur du rectangle rogné dans la PictureBox1
Dim bit As Bitmap = New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
Dim CropImage = New Bitmap(cropWidth, cropHeight) 'dimension du bitmap
Dim g As Graphics = Graphics.FromImage(CropImage)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g.DrawImage(bit, 0, 0, rect, GraphicsUnit.Pixel)


PictureBox2.Image = CropImage 'affichage dans la PictureBox2 aux dimensions du rectangle rogné

Dim rapportX, rapportY As Double
rapportX = Monimage.Width / PictureBox1.Width
rapportY = Monimage.Height / PictureBox1.Height



PictureBox2.Image = RecadreImage(PictureBox1.Image, IIf(Xend > Xstart, Xstart, Xend) * rapportX, IIf(Yend > Ystart, Ystart, _
Yend) * rapportY, Math.Abs(Xend - Xstart) * rapportX, Math.Abs(Yend - Ystart) * rapportY)
PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
Dim L = PictureBox2.Width
Dim H = PictureBox2.Height
If L > H Then
PictureBox2.Width = pbL
PictureBox2.Height = (pbL / L) * H
Else
PictureBox2.Width = (pbH / H) * L
PictureBox2.Height = pbH
End If
End Sub
Private Function RecadreImage(ByVal ImaSource As Bitmap, ByVal xPixelDep As Int32, ByVal yPixelDep As Int32, ByVal xPixelTotal As Int32, ByVal yPixelTotal As Int32) As Bitmap
Dim nouvImage As New Bitmap(xPixelTotal, yPixelTotal)
Dim graph As Graphics = Graphics.FromImage(nouvImage)
Dim rect As New Rectangle(0, 0, xPixelTotal, yPixelTotal)
graph.DrawImage(ImaSource, rect, xPixelDep, yPixelDep, xPixelTotal, yPixelTotal, GraphicsUnit.Pixel)
Return nouvImage

End Function


Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim openDlg As New System.Windows.Forms.OpenFileDialog
openDlg.Filter = "JPEG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif|Bitmap Files (*.bmp)|*.bmp"
If openDlg.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
Exit Sub
End If
If Not openDlg.FileName Is Nothing Then
' PreviewPictureBox.Image = System.Drawing.Bitmap.FromFile(openDlg.FileName)
' crobPictureBox.Image = System.Drawing.Bitmap.FromFile(openDlg.FileName)

Dim nom = openDlg.FileName
Monimage = System.Drawing.Bitmap.FromFile(nom)

Dim fs As System.IO.FileStream
' Specify a valid picture file path on your computer.
fs = New System.IO.FileStream(nom, IO.FileMode.Open, IO.FileAccess.Read)
'pour ajuster l'image
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
PictureBox1.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
fs.Dispose()
fs = Nothing
pbL = PictureBox1.Width
pbH = PictureBox1.Height


End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cropSaveBtn.Click
Dim tempFileName As String
Dim svdlg As New SaveFileDialog()
svdlg.Filter = "JPEG files (*.jpg)|*.jpg|All files (*.*)|*.*"
svdlg.FilterIndex = 1
svdlg.RestoreDirectory = True
If svdlg.ShowDialog() = Windows.Forms.DialogResult.OK Then
tempFileName = svdlg.FileName 'check the file exist else save the cropped image
Try
Dim img As Image = PictureBox2.Image

SavePhoto(img, tempFileName, 225)
Catch exc As Exception
MsgBox("Error on Saving: " & exc.Message)
End Try
End If
End Sub

Private Sub cropCancelBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cropCancelBtn1.Click
PictureBox2.Image = Nothing
cropBitmap = Nothing
PictureBox1.Image = Nothing
End Sub
Public Function SavePhoto(ByVal src As Image, ByVal dest As String, ByVal w As Integer) As Boolean
Try
Dim imgTmp As System.Drawing.Image
Dim imgFoto As System.Drawing.Bitmap

imgTmp = src
imgFoto = New System.Drawing.Bitmap(w, 225)
Dim recDest As New Rectangle(0, 0, w, imgFoto.Height)
Dim gphCrop As Graphics = Graphics.FromImage(imgFoto)
gphCrop.SmoothingMode = SmoothingMode.HighQuality
gphCrop.CompositingQuality = CompositingQuality.HighQuality
gphCrop.InterpolationMode = InterpolationMode.High

gphCrop.DrawImage(imgTmp, recDest, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel)

Dim myEncoder As System.Drawing.Imaging.Encoder
Dim myEncoderParameter As System.Drawing.Imaging.EncoderParameter
Dim myEncoderParameters As System.Drawing.Imaging.EncoderParameters

Dim arrayICI() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
Dim jpegICI As System.Drawing.Imaging.ImageCodecInfo = Nothing
Dim x As Integer = 0
For x = 0 To arrayICI.Length - 1
If (arrayICI(x).FormatDescription.Equals("JPEG")) Then
jpegICI = arrayICI(x)
Exit For
End If
Next
myEncoder = System.Drawing.Imaging.Encoder.Quality
myEncoderParameters = New System.Drawing.Imaging.EncoderParameters(1)
myEncoderParameter = New System.Drawing.Imaging.EncoderParameter(myEncoder, 60L)
myEncoderParameters.Param(0) = myEncoderParameter
imgFoto.Save(dest, jpegICI, myEncoderParameters)
imgFoto.Dispose()
imgTmp.Dispose()

Catch ex As Exception

End Try
End Function
End Class
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129
Modifié par cs_Le Pivert le 17/10/2016 à 08:31
vb95, je suis désolé mais cela ne va pas du tout.La mouture précédente fonctionne nettement mieux

http://codes-sources.commentcamarche.net/forum/affich-10069723-decouper-ou-rogner-une-image#24

J'ai fait un essai avec une image en mode portrait, on ne voit pas la totalité de l'image. j'ai donc mis cela pour voir la totalité de l'image:

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        PictureBox2.SizeMode = PictureBoxSizeMode.StretchImage
        PictureBox2.Visible = False
        Dim nomfich As String = "C:\chemin image.jpg" ' fichier image à charger
        PictureBox1.Image = Image.FromFile(nomfich)
        PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
        Me.Width = PictureBox1.Width
        Me.Height = PictureBox1.Height
    End Sub


Le problème vient de l'affichage de la PictureBox2 qui se trouve sur la PictureBox1, et il en manque suivant la position de la sélection.

Reste avec le précédent code qui fonctionne très bien!!

Cdlt

PS on ne s'y retrouve pas dans les posts, c'est un véritable foutoir
@+ Le Pivert
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
Modifié par vb95 le 17/10/2016 à 11:45
Salut cs_Le Pivert
Je comprends ce que tu veux dire : Picturebox1 et Picturebox2 se chevauchent
L'idéal serait de travailler avec 2 forms : une pour Picturebox1 et l'autre pour PictureBox2 ( cette dernière étant la Form Résultat si on peut dire)
Ou se servir de ton ScreenShot encore mieux

Par contre si on prend mon premier code Picturebox1 ne prend pas automatiquement les mêmes dimensions que l'image réelle ce qui fait qu'elle est soit rétrécie soit étirée : c'est cela que notre ami Dan avait tant de mal à nous expliquer
Bonne journée à toi
0
cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022
129 > vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022

17 oct. 2016 à 11:50
Je lui est donné un lien pour télécharger mon programme avec l'exe. J'espère que cela le satisfera. Je pense qu'avec les codes développés sur ce post on n'arrivera pas à ce qu'il désire. Puisque tu as le programme Screenshot regarde la class clsRegion comme les proportions sont prisent en compte.

Bonne journée

@+ Le Pivert
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > cs_Le Pivert
Messages postés
7745
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 mai 2022

Modifié par vb95 le 17/10/2016 à 13:26
Merci cs_Le Pivert
Je connais très bien ton projet : c'est d'ailleurs de celui-ci que je me sers depuis plus d'un an ( pas trouver mieux en open source)
J'ai testé avec une seule Form et un Panel invisible contenant la PictureBox résultante
Une fois le cadre de PictureBox1 sélectionné au MouseUp de PictureBox1 j'affiche mon Panel contenant PictureBox2
Aucun souci de chevauchement d'image et plus d'image étirée ou rétrécie au chargement de Picturebox1
A la prochaine avec plaisir
0
Salut à vous deux.
J'ai finalement trouvé la solution à tous mes problèmes car les dernières propositions ne marchaient pas sur des images de taille dépassant celle de l'écran.
J'ai donc cherché une solution et je l'ai trouvé.
J'aimerais maintenant poster ce code pour qu'il puisse être disponible par d'autres personnes mais impossibles de comprendre la marche à suivre.
J'aurais voulu vous joindre ici tout au moins mon exe pour que vous puissiez le tester mais encore une fois impossible de trouver le moyen d'ajouter cet exe.
Merci de m'indiquer la marche à suivre à moins que je ne sois obligé de créer une nouvelle inscription.
A+.
Dan
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
Modifié par vb95 le 29/10/2016 à 18:15
Bonjour Dan1
Tu es inscrit sur le site comme "Visiteur anonyme"
Pour déposer une source il faut s'inscrire comme membre ; Cela t'est proposé dès l'entrée sur le site
Un fois ceci fait reste à déposer la source
1) il faut compresser le répertoire qui contient tout ton projet en.zip . Un projet appelé "Toto" donnera un fichier .zip appelé toto.zip . Zipper un fichier c'est le compresser avec Winzip ou tout autre logiciel gérant le format .zip ( avec compression normale)
Pour un projet on zippe le répertoire entier contenant le projet
Une chose à faire avant de zipper c'est de supprimer les répertoires .Bin et .Debug dans le projet : ils contiennent des exécutables du projet et on ne les mets pas dans une source sur le site.
Une fois ceci fait tu peux déposer une source
On te demandera de choisir le langage, la catégorie de projet (jeux, fichiers-disques, base de données dans une liste disponible)
Ensuite reste plus à mettre le fichier .zip sur le site et à enregistrer

tu peux mettre une description de ce que fait ton projet et même tu peux mettre une image de ton projet sur le site

Pour plus de détails je te renvoie là : http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche et principalement à l'onglet "Publier une contribution"
bon week-end à toi
0
DAN247
Messages postés
37
Date d'inscription
samedi 29 octobre 2016
Statut
Membre
Dernière intervention
31 mai 2019
2
29 oct. 2016 à 19:29
Bonjour.
Merci de ton message.
J'ai donc fait une nouvelle inscription sous le pseudo Dan247.
J'ai déposé mon projet concernant le découpage d'une image et je serai très heureux de recueillir votre avis sur ce résultat.
Quelque soit la taille de l'image elle peut apparaître en totalité à l'écran et l'on peut récupérer n'importe quelle partie de cette image et l'enregistrer.
Grand merci pour votre aide en tout cas.
Dan247
0