GDI+ et problèmes divers de débutant

mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011 - 27 août 2009 à 19:01
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011 - 31 août 2009 à 11:00
Bonjour bonjour !
Je suis actuellement en train d'essayer de comprendre comment dessiner avec GDI+, et j'avoue que j'ai un peu de mal à tout comprendre.

Pour ma future application, je dois pouvoir charger une image dans un PictureBox et dessiner des formes par dessus.
J'arrive facilement à charger une image JPEG ou PNG avec le code suivant :
Dim myBitmap As New Bitmap("C:\monimage.jpg")
Dim g As Graphics = Graphics.FromImage(myBitmap)
PictureBox1.Image = myBitmap


Problème. Si j'essaye de charger un GIF, j'obtiens une erreur comme quoi un Graphics ne peut pas contenir d'image au format de pixel indexé
Un objet Graphics ne peut pas être créé à partir d'une image au format de pixel indexé.


Effectivement, dans le MSDN, on peut lire ceci :
Vous pouvez créer des objets Graphics uniquement à partir de fichiers .bmp non indexés, tels que des fichiers .bmp 16 bits, 24 bits et 32 bits. Chaque pixel d'un fichier .bmp non indexé contient une couleur, contrairement aux pixels des fichiers .bmp indexés, qui contiennent un index dans une table de couleurs.


Comment faire pour pouvoir charger des GIF de cette façon ?
Faut-il faire une sorte de conversion quelconque avant d'affecter le Bitmap au Graphics ?

Je risque fort d'avoir d'autres soucis, mais je vous les exposerais ici au fur et à mesure

3 réponses

mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011
27 août 2009 à 20:17
Petite précision, j'arrivais bien à charger un GIF dans une PictureBox, mais je n'arrivais pas à affecter un GIF à mon Graphics pour pouvoir dessiner dessus.
Il a suffit que je pose la question après une longue recherche pour que je trouve la solution juste après
Voici donc comment je m'y suis pris :
Dim myImg As Image = Image.FromFile("C:\monimage.gif")
Dim myBitmapModif As New Bitmap(myImg)
Dim g As Graphics = Graphics.FromImage(myBitmapModif)

'mes méthodes de dessin quelconques
g.DrawLine(Pens.Black, 10, 10, 100, 200)

PictureBox1.Image = myBitmapModif

En gros, si j'affecte mon image directement au Bitmap, puis que je "charge" mon Graphics avec ce Bitmap, j'ai la fameuse erreur citée plus haut.
Alors que si j'affecte d'abord mon image à une variable Image, puis que j'affecte cette variable à mon Bitmap, pour ensuite affecter ce Bitmap au Graphics, là ça marche

Ok ça marche, mais je voudrais bien comprendre le pourquoi du comment moi !
Une âme charitable pourrait-elle m'expliquer ce phénomène de façon à ce que je comprenne ? Car mon but n'est pas d'écrire du code sans le comprendre (si si je vous jure ).

De ce que j'en ressors, une variable de type Image stockerait tous les pixels de mon Gif sans s'occuper de la table d'indexation des couleurs.
Du coup, quand je l'affecte à mon Bitmap, ce dernier n'a pas à s'occuper de cette table d'indexation, et je peux ainsi l'affecter à mon Graphics.

J'ai bon là ou je raconte n'importe quoi ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 août 2009 à 08:45
yep, Bitmap n'aime pas les images indéxes... c'est juste une "carte des bits"

d'ou la mise a plat que tu as du faire ente l'image et la palette du Gif

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
mioumiounorris Messages postés 57 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 septembre 2011
31 août 2009 à 11:00
Bonjour Renfield et merci de passer dans le coin.
Donc si je comprends bien, un Bitmap n'est rien d'autre qu'une "grille de pixels en mémoire" ?

Toujours à la découverte de GDI+ (et de VB.net lol), je fais joujou avec les fonctions de dessin (DrawRectangle ...), et j'arrive à peu près à faire ce que je veux pour l'instant.
Seuleument je me rends compte que ces fonctions peuvent prendre des arguments en Integer ou en Single. Ayant justement besoin de faire plein de calculs de positions en ce moment, j'imagine que les arguments de type Single sont là pour permettre de n'arrondir un résultat qu'à la fin.
En effet, étant plus graphiste que programmeur, quand je dessine un pixel dans Photoshop ou autre, évidemment, je le dessine toujours sur un pixel ou son voisin ... pas entre les deux.

Du coup je converti toujours en Integer avant de passer mes valeurs aux fonctions de dessin, mais graphiquement, j'ai quelques fois un arrondi bizarre qui se fait, et mon cercle (ou rectangle ...) décalé d'un pixel. Logique me direz-vous.
Mais quel serait le moyen d'avoir le meilleur arrondi possible ?
0
Rejoignez-nous