Redimentionner une image qui a fait l'objet de la méthode "Stretch" [Résolu]

Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
- - Dernière réponse : djedjeska
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
- 20 juin 2012 à 09:47
Bonjour à tous,

j'ai un problème avec les images d'un contrôle PictureBox.

De façon à ce que le fond de mon image soit transparente, j'ai utilisé une fonction avec un GraphicPath.

Ca fonctionne très bien, pour tous les objets que j'ajoute à mon Form, j'obtiens une image transparente.

Cependant, à un moment donné, je réduis proportionnellement la taille d'un objet en particulier, dont le BackGroundImageLayout est défini sur "Stretch", de façon à ce que l'image s'adapte automatiquement à sa taille.

Or, le graphicpath de l'objet n'est plus approprié (si il faisait 5 sur 5 par exemple, et que je réduit ma taille de moitié, il reste 5 sur 5 et l'image ne s'affiche pas correctement)

Il me suffirait donc de récupérer la nouvelle image (après le stretch, c'est à dire plus petite) de façon à réappliquer ma fonction de transparence et adapter le GraphicPath.

Si vous avez des suggestions, merci beaucoup.

Djedjeska
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
3
Merci
mais il utilise un Form rendu transparent via la propriété TransparencyKey
Tu n'es pas obligé de le faire, j'ai utilisé ce moyen pour te montrer que tout peut être transparent.
tu dessines des formes à la main

Tu peux très bien charger tes propres images dans les bitmaps et définir n'importe quelle couleur de transparence.
mais reste le problème de réduction de l'image

L'outil Graphics permet de redimmentionner, par sa méthode DrawImage (qui possède 24 surcharges) dont celle-ci qui te permet aisément de redimmensionner tes images.

Merci Utilisateur anonyme 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
3
Merci
Et une petite démo :
Option Strict On
Public Class Form1
    Dim b As Bitmap

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        b = New Bitmap("image.jpg")
        b.MakeTransparent(Color.White)
    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        e.Graphics.DrawImage(CType(b, Image), New Rectangle(0, 0, 80, 65), New Rectangle(0, 0, b.Width, b.Height), GraphicsUnit.Pixel)
    End Sub
End Class

Merci Utilisateur anonyme 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
Voici ma fonction de transparence (trouvée sur internet et modifiée un tout petit peu)

    Public Function Transparent(ByVal MonImage As Image) As System.Drawing.Drawing2D.GraphicsPath
        'Transparence réelle 
        Dim X As Integer
        Dim Y As Integer
        Dim MaBitmap As New Bitmap(MonImage) 'crée un bitmap à partir de l'image
        Dim MonGraphicsPath As New System.Drawing.Drawing2D.GraphicsPath()
        Dim Masque As Color = Color.FromArgb(0) 'MaBitmap.GetPixel(0, 0) 'obtient le pixel au point 0,0

        'Parcours de tous les pixels de l'image
        For X = 0 To MaBitmap.Width - 1
            For Y = 0 To MaBitmap.Height - 1
                If Not MaBitmap.GetPixel(X, Y).Equals(Masque) Then 'si la couleur du pixel donné n'est pas égale à celle du pixel par défaut, transparent
                    MonGraphicsPath.AddRectangle(New Rectangle(X, Y, 1, 1)) 'on ajoute un rectangle à notre forme (graphicspath) 
                End If
            Next
        Next

        'Libère le bitmap et retourne la nouvelle forme graphique
        MaBitmap.Dispose()

        Return MonGraphicsPath

    End Function


Après j'utilise :

Boule.Region = New system.Drawing.Region(Transparent(Boule.BackgroundImage))
Commenter la réponse de djedjeska
0
Merci
Bonsoir,

La classe Bitmap possède sa propre méthode (MakeTransparent) pour rendre une couleur transparente. Inutile de se compliquer la vie avec un GraphicPath.
La propriété SizeMode devrait plutôt être définie sur Zoom pour étirer l'image de façon proportionnelle.
Commenter la réponse de Utilisateur anonyme
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
Je vais revoir le maketransparent, mais si j'étais passé au GraphicsPath, c'est parce que j'ai épluché des centaines de pages qui traitaient du sujet, et qu'aucune solution ne fonctionnait :

Lorsqu'une image est rendu transparente, c'est souvent le fond du Form qui est appliqué à l'image. Conséquence, lorsque mon objet passe au dessus d'un autre, ça ne fonctionne pas...

Le GraphicsPath me permet de découper les objets de façon à ce que la transparence soit parfaite... Je vais quand même voir le MakeTransparent et vérifier si mes doutes sont fondés.
Commenter la réponse de djedjeska
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
Merci de ta réponse au fait !
Commenter la réponse de djedjeska
0
Merci
Pourquoi t'obstines-tu à vouloir placer tes images dans des conteneurs pour les déplacer.
Dessine donc directement ces images sur ton formulaire. Pratique et rapide!
Commenter la réponse de Utilisateur anonyme
0
Merci
Un petit exemple pour illustrer :
Option Strict On
Public Class Form1
    Dim b1 As New Bitmap(30, 30)
    Dim b2 As New Bitmap(30, 30)
    Dim g1 As Graphics = Graphics.FromImage(b1)
    Dim g2 As Graphics = Graphics.FromImage(b2)
    Dim rect As New Rectangle(0, 0, 30, 30)
    Dim x1, y1, x2, y2 As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        g1.FillRectangle(Brushes.White, rect)
        g2.FillRectangle(Brushes.White, rect)

        g1.FillEllipse(Brushes.Blue, rect)
        g2.FillEllipse(Brushes.Red, rect)

        b1.MakeTransparent(Color.White)
        b2.MakeTransparent(Color.White)

        With Me
            .Size = New Size(400, 400)
            .FormBorderStyle = FormBorderStyle.None
            .BackColor = Color.White
            .TransparencyKey = Color.White
            x2 = .Width
            y2 = .Height
        End With

        Dim tmr As New System.Timers.Timer(15)
        AddHandler tmr.Elapsed, AddressOf tmr_Elapsed
        tmr.Start()
    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        e.Graphics.DrawRectangle(New Pen(Brushes.Black, 10), Me.ClientRectangle)
        e.Graphics.DrawString("J", New Font("Wingdings", 40), Brushes.YellowGreen, New Point(170, 170))
        e.Graphics.DrawImage(b1, New Point(x1, y1))
        e.Graphics.DrawImage(b2, New Point(x2, y2))
    End Sub

    Private Sub tmr_Elapsed(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs)
        Me.Invalidate(New Rectangle(x1, y1, 32, 32))
        Me.Invalidate(New Rectangle(x2, y2, 32, 32))
        x1 += 1 : y1 += 1 : x2 -= 1 : y2 -= 1
        If x1 > Me.Width Then DirectCast(sender, Timers.Timer).Stop()
    End Sub
End Class
Commenter la réponse de Utilisateur anonyme
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
Ca me semble beaucoup plus compliqué...

Est-ce que ça permet une réelle transparence lors de la superposition de plusieurs images ?

Et comment réduire la taille d'une image que tu as dessiné ?
Commenter la réponse de djedjeska
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
Après vérification, le MakeTransparent n'est effectivement pas suffisant : il se contente de copier l'arrière plan du Form...

Ton exemple est intéressant, je vais l'étudier plus en profondeur, mais il utilise un Form rendu transparent via la propriété TransparencyKey, et en plus tu dessines des formes à la main, mais moi j'ai besoin d'images (donc plus complexes), c'est pour ça que j'utilisais un PictureBox.

Après y'a peut être un moyen pour utiliser l'image d'une bitmap et la dessiner directement sur le Form, mais reste le problème de réduction de l'image, qui est le sujet de ma requête
Commenter la réponse de djedjeska
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
J'ai trouvé une solution pas trop mal :

j'utilise la propriété GetThumbnailImage pour réduire mon image en fonction de la taille de mon objet.
Attention, il faut enregistrer l'image de base, pour une meilleure qualité, surtout en cas de réductions successives de la taille.

    Public Function SubCallback() As Boolean
        Return True
    End Function

Sub RéduireImage()
        Dim CallBack As New Image.GetThumbnailImageAbort(AddressOf SubCallback)
ObjetImage = Objet.Image 'Il faut déclarer ObjetImage en tant que BitMap au préalable

Objet.Width -= 10
Objet.Height-= 10

            Objet.Image = ObjetImage.GetThumbnailImage(Objet.Width, Objet.Height, CallBack, New IntPtr)
            Objet.Region = New System.Drawing.Region(Transparent(Objet.Image))

End Sub
Commenter la réponse de djedjeska
0
Merci
pour réduire mon image en fonction de la taille de mon objet
C'est du gaspillage inutile de ressources que d'utiliser des conteneurs picturebox pour déplacer des images. Mais soit.
A+
Commenter la réponse de Utilisateur anonyme
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
Merci beaucoup banana32 !
Tes réponses m'ont beaucoup aidé et sont très constructives.

Je vais m'en inspirer et essayer de ne plus utiliser de contrôles.

Merci et à bientôt !
Commenter la réponse de djedjeska

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.