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

Résolu
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013 - 19 juin 2012 à 20:03
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre 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

13 réponses

Utilisateur anonyme
20 juin 2012 à 00:01
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.
3
Utilisateur anonyme
20 juin 2012 à 00:26
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
3
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 juin 2012 à 20:06
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))
0
Utilisateur anonyme
19 juin 2012 à 20:15
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.
0

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

Posez votre question
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 juin 2012 à 20:33
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.
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 juin 2012 à 20:33
Merci de ta réponse au fait !
0
Utilisateur anonyme
19 juin 2012 à 21:14
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!
0
Utilisateur anonyme
19 juin 2012 à 22:08
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
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 juin 2012 à 22:25
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é ?
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 juin 2012 à 23:24
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
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
19 juin 2012 à 23:55
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
0
Utilisateur anonyme
20 juin 2012 à 00:05
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+
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
20 juin 2012 à 09:47
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 !
0
Rejoignez-nous