Photosexpress - traitement de photos

Description

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.

Codes Sources

A voir également

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.