Transparence d'image

cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018 - 15 févr. 2007 à 19:59
cs_Anotine Messages postés 64 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 14 septembre 2008 - 17 févr. 2007 à 11:24
Bonjour!
Alors voici mon problème, qui parait assez simple mais qui est un vrai casse tête depuis quelques jours :( :

Pour les besoins d'un logiciel, je dois afficher une image (sur fond transparent) dans une picturebox.
Déja, premier problème : l'image, lorsqu'elle est chargée et affichée se vois modifiée ..

Ensuite, lorsque l'utilisateur clique sur cette picturebox, via un calcul je dois sélectionner une zone précise de l'image (une case de 16*16 pixel).

Lors de l'affichage du morceau sélectionné dans une autre picturebox prévue a cet effet, la taille s'en retrouve totalement modifiée .. je me retrouve avec un truc minuscule, et donc inutilisable..

Et le plus étrange dans tout cela, c'est que ce problème n'aparrait qu'avec des image transparente, et non avec d'autres images ..

Quelqu'un peut-il me dépanner?

6 réponses

cs_Anotine Messages postés 64 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 14 septembre 2008
15 févr. 2007 à 21:27
Donnes nous d'abord une explication plus precise : Un petit morceau de code, le comportement de cette modification ..
Peut-être est-ce un problème avec les couches alpha de ton image transparente ?! ... Il nous faut du code ! 











<hr />
La programmation est l'art de mettre 15 jours pour gagner quelques millisecondes ...
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 févr. 2007 à 21:40
Tu ne nous dis bien évidemment pas tout !

Si tu utilises une fonction de l'Api de Windows : quelle est cette fonction ?
Tu parles curieusement d'une "une image (sur fond transparent)" ! Qu'est-ce que celà veut dire ? (rien pour moi, même si je "devine un peu" )

Montre ton code, en effet, y compris et surtout celui de la déclaration de la fonction gérant ta "transparence"...

Une chose est certaine : si par "transparence de fond", tu veux dire en fait "une couleur qui, déclarée "transparente", sera ignorée; l'image de ta pictureBox risque fort de ne pas être transformée "au fond" mais seulement en "apparence".

Si... et si... et si, encore...
Mais on peut aller très loin avec tout ces "si".... seul ton code commenté "nous parlera".... et les conseils viendront alors... pas avant.
0
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
16 févr. 2007 à 18:12
hmm je ne pense pas que le code puisse vous aider énormément, mais soit :

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

'on load deux copie de l'image en mémoire

biblio = RecupImage(chemin & "\tiles.png")
biblioSansgrille = RecupImage(chemin & "\tiles.png")

'sur la première on trace le quadrillage afin de choisir les morceau d'images voulues
biblio_graphic = Graphics.FromImage(biblio)
For i As Integer = 0 To biblio.Width Step 16
biblio_graphic.DrawLine(Pens.Green, i, 0, i, biblio.Height)
Next
For i As Integer = 0 To biblio.Height Step 16
biblio_graphic.DrawLine(Pens.Green, 0, i, biblio.Width, i)
Next
biblio_graphic.DrawImage(biblio, 0, 0)
'et on l'affecte a la picturebox
picTile.Image = biblio
end sub


voici la function recupimage en question :

Private Function RecupImage(ByVal chemin As String) As Bitmap
'cette sub récupère des images (ici utilisée pour récupérer celle du monstre et celle du joueur)
'en un minimum de temps, tout en libérant au plus vite la mémoire
Dim originale As Bitmap = New Bitmap(chemin)
Dim copie As Bitmap = New Bitmap(originale.Width, originale.Height)
Dim g As Graphics = Graphics.FromImage(copie)
g.DrawImage(originale, 0, 0)
g.Dispose()
originale.Dispose()
Return copie
End Function

a noter que même avec image.Fromfile, le chargement de l'image dont le fond est DEJA transparent dans le fichier de base ne marche pas ..

voici ensuite le code qui se produit lorsque l'on clique sur la picturebox contenant l'image quadrillée :

Private Sub picTile_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picTile.MouseClick

'on retrouve les coordonnées du clique de la case
Dim Xclick As Long = Int(Int(e.X) / 16)
Dim Yclick As Long = Int(Int(e.Y) / 16)
'on l'affecte a la picturebox permettant le controle de la zone selectionnée
bit_CurTile = RecadrerImage(biblioSansgrille, New Rectangle(Xclick * 16, Yclick * 16, 16, 16))
picCurTile.Image = bit_CurTile
End Sub

et enfin voici la function recadrerImage :

Private Function RecadrerImage(ByVal ImgSource As Image, ByVal Rect As Rectangle) As System.Drawing.Image
'cette sub permet de récupérer une portion d'un bitmap sans le prendre dans son intégralité
If ImgSource IsNot Nothing Then
Dim ImgOut As System.Drawing.Image = New System.Drawing.Bitmap(Rect.Width, Rect.Height, ImgSource.PixelFormat)
Dim Graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ImgOut)
Graphics.DrawImage(ImgSource, 0, 0, Rect, System.Drawing.GraphicsUnit.Pixel)
Return ImgOut
End If
Return Nothing
End Function

Anoter que lorsque j'utilise des image normal, ce code marche parfaitement, mais que cela ne va plus avec les image dont le fond est DEJA transparent .. et devoir gérer cela par code impliquerait beaucoup de travail niveau PC, et celle-ci est précieusecar le logiciel globale peut etre assez gourmant ..

Voilou
0
cs_Anotine Messages postés 64 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 14 septembre 2008
16 févr. 2007 à 19:23
Ton code fonctionne très bien chez moi ... même avec une image transparente. C'est à rien y comprendre !
Dis moi si je me trompe : Lorsque tu clique sur une partie de l'image picTile l'image picCurTile doit afficher le petit bout de l'image que tu as cliqué !? Dans ce cas ça marche très bien ... (VS 2005 - Framework 2 et toutes les mises à jour)


Bonne continuation






<hr />
La programmation est l'art de mettre 15 jours pour gagner quelques millisecondes ...
0

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

Posez votre question
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
16 févr. 2007 à 20:19
arf bah moi ça ne veut pas marcher :s j'utilise aussi VS 2005 framework 2 mis a jour ..
bon bah ça vient peut être du fichier lui meme, les .png sont peut etre mal géré si transparents :s
Tant pis je continuerais a chercher, merci quand meme :)
0
cs_Anotine Messages postés 64 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 14 septembre 2008
17 févr. 2007 à 11:24
Essaye d'enlever les meusures dans ton code :

Au lieu de  :
Private Function RecadrerImage(ByVal ImgSource As Image, ByVal Rect As Rectangle) As System.Drawing.Image
        ' Cette fonction permet de récupérer une portion d'un bitmap sans le prendre dans son intégralité
        If ImgSource IsNot Nothing Then
            Dim ImgOut As System.Drawing.Image = New System.Drawing.Bitmap(Rect.Width, Rect.Height, ImgSource.PixelFormat)
            Dim Graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ImgOut)
            Graphics.DrawImage(ImgSource, 0, 0, Rect, System.Drawing.GraphicsUnit.Pixel)
            Return ImgOut
        
End If
        Return Nothing
End Function

Essaye :
Private Function RecadrerImage(ByVal ImgSource As Image, ByVal Rect As Rectangle) As System.Drawing.Image
        ' Cette fonction permet de récupérer une portion d'un bitmap sans le prendre dans son intégralité
        If ImgSource IsNot Nothing Then
            Dim ImgOut As System.Drawing.Image = New System.Drawing.Bitmap(Rect.Width, Rect.Height)
            Dim Graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ImgOut)
            Graphics.DrawImage(ImgSource, 0, 0, Rect)
            Return ImgOut
        End If
        Return Nothing
End Function

En espérant que ça marche !
0
Rejoignez-nous