Application complète à compiler , bien commentée :
-Allégements de taille sans détérioration des photos
-Des recadrages (en ellipse,rectangle,hexagone), les redimensionnements , et copie-coller
-Mise en page d'impressions d'une photos ou d'une série de photos.
-Un traitement par lots (fichiers issus d'un appareil photos par exemple) est disponible.
ça vaut le coup, je m'en sert souvent ... y compris éventuellement pour modifier les
commentaires de ses photos (metadonnées)...
===> Merci pour tous ceux qui ont inspiré des extraits de code tels que :
VBShared pour les écritures de metadonnées dans un fichier image.
Le créateur de la sauvegarde jpg avec réglage de la qualité.
Le créateur de la source magique controlmatrix , fulgurante pour lumière,contraste,gamma,inversion etc...
Source / Exemple :
Un exemple (extrait de code) : Pour transporter un coupon elliptique,hexagonal sur un fond (copie_coller) - Graph est une picturebox, sel un rectangle, bmp(rang) un état de l'image en cours, collageencours et selectionencours des booléens. G de type Graphics
Private Sub graph_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles graph.MouseMove
If SelectionEnCours Or CollageEnCours Then
If graph.SizeMode = PictureBoxSizeMode.Normal Then 'rester en taille reelle et tenir compte du scroll
sel.Width = e.X + defilex.Value - sel.X
sel.Height = e.Y + defiley.Value - sel.Y
Else 'tenir compte de la reduction
sel.Width = e.X * fx - sel.X
sel.Height = e.Y * fy - sel.Y
End If
Dim calque = bmp(Rang).Clone 'cloner le bmp actuel (vierge du cadre)
G = Graphics.FromImage(calque)
If CollageEnCours Then 'CollageEnCours en cours, le CouponPp est défini
Dim offx = CInt(sel.Width + sel.X - CouponPp.Width / 2)
Dim offy = CInt(sel.Height + sel.Y - CouponPp.Height / 2)
Select Case formes.Text
Case "Ellipse" 'créer la texture bitmap de la brosse
'definition de la place de l'ellipse
Dim ch_graph As New Drawing2D.GraphicsPath
ch_graph.AddEllipse(offx, offy, CouponPp.Width, CouponPp.Height)
'faire une brosse texture avec le coupon
Dim BrosseTexture = New TextureBrush(CouponPp.Clone)
'translater la brosse (en Tile - mosaïque à partir de 0,0 ) pour l'ajuster à la place du coupon sur l'image
BrosseTexture.TranslateTransform(offx Mod CouponPp.Width, offy Mod CouponPp.Height) 'sel.X Mod CouponPp.Width, sel.Y Mod CouponPp.Height)
G.FillPath(BrosseTexture, ch_graph)
'nettoyage
ch_graph.Dispose()
BrosseTexture.Dispose()
Case "Hexagone" 'créer la texture bitmap de la brosse
'definition de la place du polygone
Dim ch_graph As New Drawing2D.GraphicsPath
Dim a = CouponPp.Width
Dim b = CouponPp.Height
sommets(0) = New Point(offx + a / 4, offy)
sommets(1) = New Point(offx + 3 * a / 4, offy)
sommets(2) = New Point(offx + a, offy + b / 2)
sommets(3) = New Point(offx + 3 * a / 4, offy + b)
sommets(4) = New Point(offx + a / 4, offy + b)
sommets(5) = New Point(offx, offy + b / 2)
ch_graph.AddPolygon(sommets)
'faire une brosse texture avec le coupon
Dim BrosseTexture = New TextureBrush(CouponPp.Clone)
'translater la brosse (en Tile - mosaïque à partir de 0,0 ) pour l'ajuster à la place du coupon sur l'image
BrosseTexture.TranslateTransform(offx Mod CouponPp.Width, offy Mod CouponPp.Height) 'sel.X Mod CouponPp.Width, sel.Y Mod CouponPp.Height)
G.FillPath(BrosseTexture, ch_graph)
'nettoyage
ch_graph.Dispose()
BrosseTexture.Dispose()
Case "Rectangle"
G.DrawImage(CouponPp, offx, offy)
End Select
End If
If SelectionEnCours Then 'selection en cours
Select Case formes.Text 'tracer la forme sur le calque
Case "Rectangle"
G.DrawRectangle(Crayon, retourne(sel)) 'car le rectangle n'est pas tracé si non retourné, mais Sel reste tel quel
Case "Ellipse"
G.DrawEllipse(Crayon, sel)
Case "Hexagone"
Dim a = sel.Width 'l'hexagone n'est pas forcément régulier
Dim b = sel.Height
sommets(0) = New Point(sel.X + a / 4, sel.Y)
sommets(1) = New Point(sel.X + 3 * a / 4, sel.Y)
sommets(2) = New Point(sel.X + a, sel.Y + b / 2)
sommets(3) = New Point(sel.X + 3 * a / 4, sel.Y + b)
sommets(4) = New Point(sel.X + a / 4, sel.Y + b)
sommets(5) = New Point(sel.X, sel.Y + b / 2)
G.DrawPolygon(Crayon, sommets) 'tracer sur le calque le rectangle, et l'image si CollageEnCours
End Select
End If
G.Dispose()
If graph.SizeMode = PictureBoxSizeMode.Normal Then 'il faut ajuster le calque à la fenetre en tenant compte du scroll
Dim recadre As Bitmap
recadre = calque.clone
G = Graphics.FromImage(recadre)
Dim destrect As Rectangle
destrect.Size = graph.Size
G.DrawImage(calque, destrect, defilex.Value, defiley.Value, destrect.Width, destrect.Height, GraphicsUnit.Pixel)
graph.Image = recadre.Clone
recadre.Dispose()
calque.dispose()
G.Dispose()
Else
graph.Image = calque.clone 'l'affecter à l'image écran
calque.dispose()
End If
End If
End Sub
Conclusion :
Je sais que le code est volumineux, mais il est bien structuré et commenté.
Vous pourrez peut être y trouver votre bonheur.
Donnez moi vos impressions, les bugs détectés...
Pour des questions de taille de zip, la source doit être recompilée sur votre poste... et vous pourrez utiliser cet utilitaire pour vos besoins..cf copie d'écran.
L'utilitaire MetaRW.exe n'est pas joint, mais vous le trouverez dans la source de VBShared (MetaReadWriter.exe)
Mais une fois compilé, le à propos... (about) du menu fichier permet une mise à jour de l'application à partir de mon site.
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.