EXEMPLE D'UTILISATION DE GDI+ DANS VB6

Signaler
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
-
cs_youcef09
Messages postés
1
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
20 novembre 2012
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39804-exemple-d-utilisation-de-gdi-dans-vb6

cs_youcef09
Messages postés
1
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
20 novembre 2012

bonjour
dans le cas où mon fichier tif est composé en plusieurs pages es ce que ce programme l'affiche
cs_VinceVG
Messages postés
222
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
30 mars 2016

LA mise à l'échelle se fait mal avec les wmf mais je ne trouve pas comment corriger.
cs_VinceVG
Messages postés
222
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
30 mars 2016

J'ai ajouté un bout de code pour conserver les proportions. Je mets du coup ma modif en entier. Pour effacer, je dessine un carré de la couleur du fond ce qui n'est pas trés académique et qui va vite atteindre ses limites. Si qqn a une idée je suis preneur.

'# Permet de dessiner une image issue d'un fichier, en la redimensionnant si nécessaire, et en appliquant un % de translucidité
'**** ByRef voImage As BitMap -- L'image à transmettre
'**** ByVal vnTargetDC As Long -- Le handle de la fenêtre où tracer l'image
'**** ByVal vnX As Long -- Position x (le centre de l'image)
'**** ByVal vnY As Long -- Position y (le centre de l'image)
'**** Optional ByVal vnWidth -- Largeur facultative
'**** Optional ByVal vnHeight -- Hauteur facultative
'**** Optional ByVal vnTransparency As Single = 1 -- Transparence Facultatif entre 0 et 1 : pourcentage de transparence
'**** Optional vnAngle As Single = 0 -- Angle de rotation Facultatif en degrés
Public Sub DrawImage(ByRef voImage As BitMap, ByVal vnTargetDC As Long, ByVal vnX As Long, ByVal vnY As Long, Optional ByVal vnWidth, Optional ByVal vnHeight, Optional ByVal vnTransparency As Single 1, Optional vnAngle As Single 0)
Dim hTargetGraphics As Long
Dim hImageAttr As Long
Dim lpColorMatrix As GpColorMatrix
Dim lpOrg As GpPointF
Dim PortionImageX As Long
Dim PortionImageY As Long
Dim LargeurFinale As Long
Dim HauteurFinale As Long

'# On crée un objet de type Graphic, issu de notre hDc
If GdipCreateFromHDC(vnTargetDC, hTargetGraphics) = Gp_Ok Then
'# On crée des attributs d'image.
'# C'est uniquement nécessaire ici pour dessiner l'image en semi transparence
GdipCreateImageAttributes hImageAttr

With lpColorMatrix
.m(0, 0) = 1
.m(1, 1) = 1
.m(2, 2) = 1
.m(3, 3) = vnTransparency
.m(4, 4) = 1
End With

'# On renseigne nos attributs (hImageAttr)
GdipSetImageAttributesColorMatrix hImageAttr, ColorAdjustTypeBitmap, True, lpColorMatrix, lpColorMatrix, ColorMatrixFlagsSkipGrays

'# Si on ne passe pas de dimension (largeur ou hauteur),
'# On n'effectue pas de redimensionnement : on garde les dimensions de l'image
If IsMissing(vnWidth) Then
vnWidth = voImage.Width
End If
If IsMissing(vnHeight) Then
vnHeight = voImage.Height
End If

PortionImageX = voImage.Width
PortionImageY = voImage.Height

LargeurFinale = (vnHeight * PortionImageX) / PortionImageY
HauteurFinale = vnWidth
If LargeurFinale > vnHeight Then
LargeurFinale = vnHeight
HauteurFinale = (vnWidth * PortionImageY) / PortionImageX
End If


lpOrg.X = vnX
lpOrg.Y = vnY

'# On traduit les coordonnées en coordonnées du monde : orientée à vnAngle degrés
If vnAngle <> 0# Then
GdipRotateWorldTransform hTargetGraphics, vnAngle, MatrixOrderPrepend
GdipTransformPoints hTargetGraphics, CoordinateSpaceWorld, CoordinateSpaceDevice, lpOrg, 1
End If

'# On dessine enfin notre image.
'# On aurait pu utiliser GdipDrawImage, ou GdipDrawImageRect, mais elles ne permettent
'# pas de prendre en compte les attributs (ici la transparence)
GdipDrawImageRectRectI hTargetGraphics, voImage.Handle, lpOrg.X + LargeurFinale * -0.5, lpOrg.Y + HauteurFinale * -0.5, LargeurFinale, HauteurFinale, 0, 0, PortionImageX, PortionImageY, UnitPixel, hImageAttr

'# On détruit nos attributs d'image
GdipDisposeImageAttributes hImageAttr

'# On détruit notre objet Graphic
GdipDeleteGraphics hTargetGraphics
End If
End Sub
cs_VinceVG
Messages postés
222
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
30 mars 2016

Pour l'ajustement au rectangle de destination j'ai un rien modifié le code. J'ai rajouté la capture de la taille de l'image :
Dim PortionImageX As Long
Dim PortionImageY As Long
.
.
.
PortionImageX = voImage.Width
PortionImageY = voImage.Height

Et j'ai modifié l'appel de la fonction GDI+ :
GdipDrawImageRectRectI hTargetGraphics, voImage.Handle, lpOrg.X, lpOrg.Y, vnWidth, vnHeight, 0, 0, PortionImageX, PortionImageY, UnitPoint, hImageAttr


Maintenant ceci marche.
J'ai toujours les problèmes d'effacement et de conversion de coordonnées.
cs_VinceVG
Messages postés
222
Date d'inscription
mercredi 8 septembre 2004
Statut
Membre
Dernière intervention
30 mars 2016

Merci pour ce code que j'arrive à utiliser dans word 2010 en vba.

Par contre je n'arrive pas :
- à effacer un image,
- à lui changer sa taille (mise à l'échelle).

Je n'ai pas non plus trouvé comment convertir les coordonnées d'un élément de ma fenêtre (form 2.0) vers la position de l'image. C'est moins crucial je peux quand même coder directement la position pour les 2 ou 3 images que j'aurais à mettre.
fondrose
Messages postés
1
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
17 juillet 2011

Bonjour
je prends la file de cette longue liste de post pour dire mon admiration sur ce code...
Je cherche à l'utiliser pour importer des images TIFF dans VB6 (ne comprenant pas pourquoi il y a aussi peu de codes / routines permettant de faire cette importation qui semble pourtant naturelle vu le succès du format TIF...).
Bref, j'ai quand même un souci (vu mon inexpérience 'informatique' de VB6 alors que je programme beaucoup pour faire du calcul) : le code marche quand je le lance depuis VB6, mais quand je crée un EXE ça n'affiche aucune image ?... J'imagine que le "lien" vers GDI+ n'est pas créé dans l'exe (faut-il déclarer un composant, une référence ?..). Une idée quelqu'un(e) ? Merci d'avance
andalo
Messages postés
103
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
20 octobre 2012

Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
je dirai...
création d'une fenetre translucide superposée...
andalo
Messages postés
103
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
20 octobre 2012

En m'aidant de cette source, je me demande si il serai possible de recouvrir un Form et tout ses contrôles d'un voile blanc transparent. Comme c'est dis plus haut le contrôle Picturebox n'est pas transparent et visiblement il n'y a pas moyen de remplir le contrôle Image de cette façon.
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
Heu... autant pour moi, je dois avoir les yeux qui louchent...
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
Il me semble que dans ton code tu n'utilise pas de GdipDisposeImageAttributes ... pas bien ;)
Private Declare Function GdipDisposeImageAttributes Lib "gdiplus" (ByVal imageattr As Long) As Long
cordialement,
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
je jeton GDI+ est a decharger a la fin...
j'ai un super code, pour ca, ideal pour l'IDE.

on peux meme presser STOP dans l'IDE, 0 plantage ^^

ca tourne avec de l'injection ASM, creation de fenetre, FindWindow etc
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
Merci pour ton aide renfield.
J'avais aussi une erreur de plantage venant de l'ordre de déchargement de mes classes
j'ai une classe gdi_environement qui gère le startup & shutdown
une classe gdi_graphic qui gère un graphic
et je déchargeais l'environement avant le graphic --> plantage sévère

un bon week-end à toi et à bientôt
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
j'ai restructure le code, ca devrait t'aider
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
j'ai trouvé la méthode suivante pour traiter directement en objet : il faut utiliser un iunknown et non pas un long, du coup on peut décharger avec un "Set pH = nothing"

problème maintenant, je n'arrive plus à utiliser la fonction pour charger l'image depuis le stream ;(

je déclare les fonctions comme ceci
Private Declare Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ByRef ppstm As IUnknown)
Private Declare Function LoadImageFromStream Lib "GdiPlus.dll" Alias "GdipLoadImageFromStream" (ByRef mStream As IUnknown, ByRef mImage As Long) As GpStatus

puis j'utilise :
Call CreateStreamOnHGlobal(VarPtr(pContent(0)), False, pH) <<< FONCTIONNE
Dim i As Long, res As GpStatus
res = LoadImageFromStream(pH, i) <<< PLANTAGE

une idée ?
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
je suis au regret de dire que la méthode ci dessus fait planter violemment (debugur asm se met en route)

en revenche, j'ai trouvé une syntaxe passant par l'utilisation d'un iUnKnown et non d'un long
du coup on peut le décharger avec un "Set pHandle = Nothing"

mon problème avec le iUnknown, c'est que ma fonction LoadImageFromStream requiert un long
et que de mettre Varptr(pHandle) fait aussi sortir le debugueur asm de sa boite ^^

cordialement,
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
oui, c'est bien cela...
un simple Release de ton objet suffit.
ici, ton Long est un pointeur (comme ObjPtr) vers ton IStream.

dans ton Terminate de ta classe, tu pourrais faire le Release de ton Stream.

possible en gros de faire :

Dim obj as Object
CopyMemory byval VarPtr(obj), byval HANDLE, 4
suivi de :
Set obj = Nothing

pour qu'il libère ton Handle (Release)
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
pour ma part, j'ai implémenté une classe gdi_stream qui permet de charger l'image à partir d'un fichier puis de stoquer dans un tableau de bytes (interface avec un propertybag également)
alors j'aimerais bien libérer dans le classe_terminate le stream.

pour le "Release IUnknown du Stream", pour ma part, le stream c'est un "Long" ???

et en passant connais-tu éxactement l'api à utiliser pour le release ? msdn donne juste un "IUnknown::Release" ;(

cordialement,
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
dans l'absolu, tu n'as pas tord.
faudrais faire un Release de l'IUnknown du Stream.

a ne faire bien sur qu'une fois l'objet utilise...
du coup, ca compliquait l'exemple, ici.

c'est aussi pour ca que j'utilise un tableau global pour le fichier
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
un petit peu en retard mais merci pour ta maj renfield.
une question me taraude : "peut ont détruire/libérer volontairement le stream" ?
dans tous les codes que je regarde avec CreateStreamOnHGlobal personne ne libère avec une instruction Destroystream ou DisposeStream...

est-ce normal ? ou fuite mémoire en perspective ?
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Je t'ai ajouté un exemple d'image stockée dans un .res

j'ai remanié un peu le code, également
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
Bonjour renfield,
merci de ta réponse (tjs aussi réactif ^^)

j'essaye de regarder du côté du Stream qui me semble la meilleur solution (les res me semblent plus lourdes à maintenir dans un projet.)

J'ai essayé d'utiliser l'interface IStream (en réimplémentant une classe perso MyStream implements IStream bien sur) mais lorsque j'utilise l'instruction gdipSaveImageToStream et bien ca plante sévèrement avec le débuger asm qui se met en route ;)

saurais tu ce qu'il faut faire éxactement avec l'interface IStream ? Si tu as un exemple dans un coin de google (parsque en me couchant à 2h du mat1 je reste à patauger)

cordialement,
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
le plus simple serai un fichier .RES
apres on doit pouvoir s'en sortir avec un stream (CreateStreamONHGlobal)
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
Bonjour Renfield.

Connaitrais-tu un moyen de faire la même chose mais avec le fichier .png stoqué dans le programme et non en fichier de dépendance ?

Admettons que je souhaite faire un controle utilisateur dont le rôle est d'afficher une jolie image avec gestion de la transparence (alpha chanel ?) comme tu le fais si bien dans ta source.
Je voudrait que ton fichier extra-terrestre soit d'une manière ou d'une autre stoqué dans le property bag pour ne pas l'avoir en dépendace de l'exe

une idée ?
cordialement,
ptard
Messages postés
28
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

bien vu, le fichier sauvegardé avec savepicture est vide, alors que le picturebox contient mon image en png du moins à l'ecran
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
sur, avec bmp et autre, un LoadPicture te suffit.

dans le cadre d'un dessin, faut ruser...

tentes un

SavePicture en exploitant l'image.
te permettra de voir si ton Image est vide ou non
si tel est le cas, tout est question d'autoredraw :

en gros:
AutoRedraw = False
Dessiner PNGAutoRedraw True> propriete Image exploitable
ptard
Messages postés
28
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

PRECISION:si les picturebox contiennent des bmp,jpg,gif,wmf cela marche impec
c'est vraiment avec un png que cela coince.
Je veux inserer un png car la qualité graphique est bien meilleure, et de plus lors d'un
redimensionnement la qualité reste parfaite.
ptard
Messages postés
28
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Tu as raison, avec la propiete image plus de plantage, je passe dans la bonne boucle comme dans ton code.
Mais mon richtextbox reste vide, autoredraw ou pas rien ne se passe.
En tout cas vraiment merci pour la justesse et la rapidité de tes reponses
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
je pense que

Picture1(Index).Picture

est Nothing
me trompe-je ?

si tu dessine dans un picturebox, prendre la propriete Image...

et jouer si besoin avec l'autoredraw
ptard
Messages postés
28
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Etant un débutant, dans un premier temps je charge plusieurs picturebox avec des png à l'aide de gdi+
Puis ensuite j'adapte ton code pour inserer mon png dans la rtb à partir d'un picturebox.
Mais vb6 se plante carrement sur l'instruction encadrée par les tirets sur la procedure suivante

Private Sub Picture1_Click(Index As Integer)
Static tObject As REOBJECT
Dim oData As IDataObject
Dim oClientSite As IOleClientSite
Dim oStorage As IStorage
Dim IID_IUnknown As UUID
Dim oStatic As IUnknown
Set oClientSite = moRichEdit.GetClientSite
Set oData = ModIDataObject.Create(Picture1(Index).Picture)
Set oStorage = StgCreateDocfile(vbNullString, STGM_CREATE Or STGM_READWRITE Or STGM_DELETEONRELEASE Or STGM_SHARE_EXCLUSIVE)
CLSIDFromString "{00000000-0000-0000-C000-000000000046}", IID_IUnknown
Stop
On Local Error Resume Next
OleCreateStaticFromData oData, IID_IUnknown, OLERENDER_DRAW, ByVal 0&, oClientSite, oStorage, oStatic

If Not Nothing Is oStatic Then
OleSetContainedObject oStatic

With tObject
.cbStruct = LenB(tObject)
.cp = Len(RichTextBox1.Text)
Set .pStg = oStorage
Set .poleobj = oStatic
Set .polesite = oClientSite
.DVASPECT = DVASPECT_CONTENT
.dwFlags = REO_BELOWBASELINE Or REO_STATIC
End With

moRichEdit.InsertObject tObject
Else

tObject.cp = Len(RichTextBox1.Text)
------------------------------------------------
moRichEdit.InsertObject tObject
------------------------------------------------
End If

Set oStorage = Nothing
Set oClientSite = Nothing
Set oStatic = Nothing

End Sub
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
je vois pas le souci
a partir du moment ou l'image a ete affichee dans ton picturebox, ce n'est plus qu'une image...

idem, donc, pour pour le RTB.

suffit peut etre de jouer avec l'AutoRedraw...
ptard
Messages postés
28
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Merci
C'est super au niveau de l'affichage de l'heure, mais sauf incomprehension de ma part
je ne vois pas comment faire une insertion de png vu que les 2 picturebox utilisees n"acceptent le png.
J'ai dejà reussi à charger des picturebox avec des png en utilisant gdi+, mais pour un rtb je sèche.
Merci quand même
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
ptard
Messages postés
28
Date d'inscription
dimanche 5 novembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Bonjour,

Cela marche vraiment tres bien, j'aimerais faire la même chose en inserant le png dans une
richtextbox

Merci pour une idée.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
pas en Object....
en Variant ^^

oui, tu peu la reprendre d'un picturebox vers GDI+, pas de soucis.

GDI32 / GDI+ ?

GDI+ fait appel a GDI32, mais offre plus de finesse.

outre la possibilité du second a charge tout type de fichiers, GDI+ permet de faire de l'antialiasing, de la translucidité, etc.

GDI (GDI32.Dll) lui ne sais que dessiner des traits, points, rectangles... c'est moins évolué...
GeneticW
Messages postés
34
Date d'inscription
samedi 3 juin 2006
Statut
Membre
Dernière intervention
23 avril 2011

j'ai fais une recherche sur extra*.png... pour retrouver ton extra terestre sur mon disque dur... j'ai donc retrouvé la source avec mes notes :)

Public Sub DrawImage(ByRef vsFilePath As String, ByVal vnTargetDC As Long, ByVal vnX As Long, ByVal vnY As Long, Optional ByVal vnWidth, Optional ByVal vnHeight, Optional ByVal vnTransparency As Single 1, Optional vnAngle As Single 0)


vnWidth, et vnHeight sont déclarer en Object (par default dans Vb6)

et j'ai perdu mon fichier de NOTES, je sais plus ou je l'ai mis... faut dire que c'Est tellement desordre ses temps ci sur mon pc, j'essaie de fair ele menage et de reformater... mais j'en remets toujours plus dedans que j'en enleve...

Domage parce que dans mon fichier de note, il y avait 2-3 commentaires...

Si je me souviens tu avais aussi oublié un refresh a un endroit...

je rephrase ma question,... par ta reponse, j'ai vu que tu n'a pas compris ce que je voulais dire...
j'ai 1 fichier... IMAGE... que je ne VEUX PAS distribuer. donc, PAS DANS LE PACKAGE.
l'idee c'Est de le mettre dans une pic box avant de compiler.
Puis-je la manipuler avec GDI+ ?
et c'est quoi la diff entre GDI et GDI+ ?
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Pas vu où tu as trouvé ce Long, typé en Object

gaffe, ici, c'est GDI+ pas GDI (c'est important)

Pour la position, disons que c'est juste un mini exemple.
on pourrais peaufiner, ajouter quelques autres exemples

et bien coder => n'instancier GDI+ qu'une fois, verrouiller la chose pour s'assurer de son déchargement...

Pour l'image chargée, su peux la conserver en mémoire... si tu as besoin de l'afficher, tu peux, oui, passer par un PictureBox, mais GDI+ peux le faire...

sinon, oui, possible de passer d'un hBmp à un Bitmap de GDI+

a suivre, donc
GeneticW
Messages postés
34
Date d'inscription
samedi 3 juin 2006
Statut
Membre
Dernière intervention
23 avril 2011

le code m'a fait rire a certains endroit... j'ai pris des notes pour t'en reparler... (il est toutefois extraordinaire)

et il y a aussi une declaration incorrecte dans une procedure (l'utilisation d'un entier long declarer comme OBJET! meuh oui... c'est une boulette ca...
Evidemment, avec Vb, le code fonctionne quand meme car on peut mettre un Long dans un objet... mais c'est juste beaucoup plus lent a instancié.

Le seul hic c'est que je ne me souviens plus ou j'ai mis le projet sur mon HD et donc je ne retrouve plus mes notes...
meuh oui... c'est une boulette de ma part ça.

je peut te dire que c'est dans le passage des paramêtre de la function...

autre petite note... au lieu que la fonction place l'image au CENTRE de la position exprimé, il aurait mieux value que tu laisse 0,0 (top, left) et passé l'information par parametre a la function pour centrer ton extra terrester.
Ainsi les gens qui ne connaissent que peu Vb aurait put réutiliser ton module. Même moi j'ai pas compris sur le coup pourquoi mes images était pas ou je les voulais...

j'ai une petite question... supposons que l'on a une image en memoire, dans un picture box par exemple. Puis-Je utiliser GDI ? ou je dois la larguer au disque pour la relire ? semble pas tres profitable en gain vitesse cette méthode. Gdi doit surement pouvoir lire une image existante en memoire...
Genre, je crée une app, je place mes images dans des picture box et je compile. je veut que Gdi fonctionne a partir de mes images dans le .exe (dans mes picture box)
merci.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Merci pour ces fleurs.

Comme je l'ai dit, c'est un exemple.

ca permet d'utiliser du PNG

maintenant, on y allume/eteint GDI+ a chaque fois, les objets ne sont pas maintenus en mémoire, etc.

du coup, c'est relativement lent...

c'est donc un exemple pour se familiariser, a revoir pour un code 'de prod'
GeneticW
Messages postés
34
Date d'inscription
samedi 3 juin 2006
Statut
Membre
Dernière intervention
23 avril 2011

Renfield: Je te regarde aller depuis un bout deja sur VbFrance et vraiment impecable le travail que tu nous donnes. MERCI mille fois.

Je suis niveaux expert aussi en Vb et vraiment j'aprécie beaucoup tes sources quand je cherche un truc que je n'ai jamais fais. Je viens juste de tomber sur celle ci et comme je j'ai jamais utiliser GDI (j'utilisais un viel object de Kodack avant mais il ne le supporte plus)

Excellente Demo, je vais la decortiquer ligne par ligne.
Merci encore.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
c'est juste un aperçu de ce que l'on peut faire.

Ca ne montre pas forcément la bonne façon de faire de manière optimale.

J'entends par là que GDI+ est ici allumé (puis éteint) chaque fois que l'on souhaite afficher l'Alien.

Dans un code bien fait, on placerai l'allumage de GDI+ et son extinction au démarrage et a la fermeture du logiciel.
SnkVrt
Messages postés
89
Date d'inscription
vendredi 16 mars 2007
Statut
Membre
Dernière intervention
23 février 2010

Je viens seulement de tomber sur cette source et je vais faire mes premiers pas avec GDI+ grâce à elle.

Très bonne base pour apprendre...
Bravo et merci.
reacen
Messages postés
282
Date d'inscription
mardi 22 août 2006
Statut
Membre
Dernière intervention
21 décembre 2010

Ah ! Je savais pas ça, Merci :)
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
ca permet de specifier les parametres optionnels.

Add 1, Text:="Texte bateau"
evite ce genre de notations :
Add 1,,,,,"Texte bateau"
reacen
Messages postés
282
Date d'inscription
mardi 22 août 2006
Statut
Membre
Dernière intervention
21 décembre 2010

J'ai pas compris ça: vnTransparency:=nTransparency, vnAngle:=nAngle
:=nTransparency // :=nAngle, Hein ? Ça veux dire quoi ? J'ai jamais vu ça sur Vb Moi :s
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
les controles images sont des controles WindowLess
en gros, on dessine sur le conteneur, et non dans une fenetre spécifique...

a toi de voir, mais vaudrais surement mieux faire de même, et dessiner sur la Form
K_Os
Messages postés
3
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
19 novembre 2008

Merci bcp pour cette source.

Mais, je m'excuse par avance de mon ignorance, comment faire pour placer l'image *.PNG dans un objet image (qui contrairement aux objets Pictures) autorise la transparence ?

En effet, j'ai bien utilisé le : set Image1.picture = Form1.image,
voir même un : set Image1.picture = Picture1.image, mais je reproduis l'image transparente avec le fond présent au moment. Du coup, je n'ai plus de transparence.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
sans hdc... (windowless)
ou sans propriété hdc ?

si tu as un hWnd, tu peut demander un hDc (via GetDC. a liberer via ReleaseDc)
tilp
Messages postés
10
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
16 novembre 2008

Renfield,

Pas de soucis effectivement pour l'ouvrir avec Winrar. Par contre fichiers corrompus avec Winzip, les mystères de l'informatique !
Super code en effet qui marche très bien !
La même question que Bouv avec des controles qui ne possèdent pas de propriété hdc ! J'ai essayé mais sans résultat pour l'instant ! Si tu as un exemple de code pour dessiner dans un controle sans hdc, je suis preneur ! Merci.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
... je viens de tester (avec Winrar) et no soucy ...
tilp
Messages postés
10
Date d'inscription
mardi 12 octobre 2004
Statut
Membre
Dernière intervention
16 novembre 2008

Bonjour Renfield.

J'ai essayé de télécharger ta source mais au moment de la dézippé, elle m'indique qu'il y a une touche incorrecte et je ne peux ouvrir ton projet. Les fichiers source sont ils toujours actualisés ? Merci de ta réponse.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
par un tableau de Byte ?

tu peux passer par un objet Stream (createStreamOnHGlobal & co)
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Salut renfield,

il manque un "GdipDisposeImage hBitmap" dans GetPicture ce qui a pour conséquence de maintenir le fichier ouvert.
Je m'en suis appercu dans un projet ou je mets les images en ressources puis je les extrait sur le hdd et je les charge avec gdi et je les supprimes, sauf que forcement ca se supprimait pas...

A ce propos, tu ne sais pas comment je pourrais faire pour charger l'image depuis un Byte() sans passer par le hdd ? (toujours avec gdi biensure)
psycho69
Messages postés
21
Date d'inscription
mardi 10 décembre 2002
Statut
Membre
Dernière intervention
30 octobre 2007

Merci sa venai bien de l'AutoRedraw de la picturebox :)
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
joue avec ton Picture1.AutoRedraw
ou dessine dans le Picture1_Paint
psycho69
Messages postés
21
Date d'inscription
mardi 10 décembre 2002
Statut
Membre
Dernière intervention
30 octobre 2007

impec sauf petit probleme quand je place l'image dans une picturebox, la picturebox redevien blanche des que l'aplication passe en arriere plan ou que je passe une fenetre par dessus
Duke49
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
2
Excellent !
anackan
Messages postés
4
Date d'inscription
samedi 4 décembre 2004
Statut
Membre
Dernière intervention
7 mars 2007

Merci pour la réponse,

Ca marche c cool,
;)
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Form1.cls
anackan
Messages postés
4
Date d'inscription
samedi 4 décembre 2004
Statut
Membre
Dernière intervention
7 mars 2007

Bonjour, je cherche a enlever les images qui ont été mis sur la form par. Autrement dit a faire un clear de la form. Comment puis je le faire sans pour autant unloader la form.
Merci.
guihome2006
Messages postés
1
Date d'inscription
jeudi 29 juin 2006
Statut
Membre
Dernière intervention
31 janvier 2007

Cette source est reellement incroyable. Cependant mon niveau en vb ne me permet pas de realiser ce que je souhaite.
Sur une Form avec transparence mettre une image png (par exemple un rond avec effet ombre) et avoir au lancement mon image png en tant que fond avec possibilite "de la bouger" et avec la transparence du png (ce qui permet d'avoir toujours l'impression d'ombre "propre" quelque soit le fond.
Ma premiere question est : est ce comprehensible ce que je viens de demander ?
seconde question : est ce possible ?
troisieme question : si c'est possible, puis je avoir quelques pistes de recherche ?
merci et encore bravo
philippe laschweng 1
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
Merci RenField pour la rapidité de ta réponse !
Effectivement c'était bien le ScaleMode + AutoRedraw de la Form, je n'ai pas fait assez attention.
J'ai également trouvé pour la picturebox !

DrawImage App.Path & "\Extra-terrestre.png", Picture1.hdc, Picture1.width / 2 + 0, Picture1.height / 2, vnTransparency:=1, vnAngle:=0

Merci encore !
Drôlement puissant...
Cordialement
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Je pense que la propriété AutoRedraw de ta Form est en cause...
Son ScaleMode également...

pour l'affichage d'un PNG dans une pictureBox, regarde la fonction DrawImage...
philippe laschweng 1
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
Salut,

Je souhaite me servir de ta source qui est drôlement intéressante mais rien ne se passe quand je le fais dans un nouveau projet ! J'ai inséré le module et les 2 lignes de codes dans le MouseDown mais rien n'y fait. Y'a besoin de quelquechose de spécial? genre OCX, dll, réf ou autres ??
Et comment insérer un PNG dans une PictureBox? Un petit exemple ?? ...

Merci par avance pour les réponses !
Cordialement
Phil
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

erf j'ai reessayer ca n'allait toujours pas puis j'ai essayer dans une VM et la ca marche.
le probleme vient donc de chez moi :(
Sorry d'avoir pris de ton temps pour rien et merci d'avoir repondu

++
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
j'ai testé, mis ca après mon Me.Refresh,
dans le Form_MouseDown du projet de test
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Salut Renfield,

Merci mais c'est bien ce que je faisais mais ca ne marche pas...

Enfin j'ai po essayer depuis une form mais depuis une pictbox mais ca ne devrait rien changer si ?

En fait je charge l'image dans la pictbox et elle s'affiche nikel, mais quand je fais un SavePicture ce ne me save que le font de la pictbox :(
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
tu peux faire :

Set Picture1.Picture = Me.Image

ou

SavePicture Me.Image, "C:\a.bmp"

pour enregistrer dans un fichier
draluorg
Messages postés
627
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Salut a tous

Exellent exemple en effet ^^

mais au rique de passer pour le boulet de service, je ne parviens pas a enregistrer l'image apres l'avoir mise sur une PictureBox ni meme la copier dans un autre control...
J'avoue ne pas avoir trop regarde le code sorry...

++
bouv
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019

Difficile de faire plus simple.
Merci
++
B0mbJacK
Messages postés
141
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
25 octobre 2006

Lu,
pour répondre à la question de bouv
pour obtenir le Hdc d'un objet,utilise cette api

Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
mortalino
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Excellent Rey, on voit que tu manipules de mieux en mieux le GDI+.

J'analiserai ton code car ça me donne une idée (encore un mystère...) pour qque chose qui me tenait à coeur mais dont je ne savais pas comment procéder, à cause des labels (de forme rectangulaire)

@++ et bonne continuation ;)
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

super Renfield, je me demande bien comment j'aurais pu le trouver tout seul.
C'est tellement interessant qu'il faut bien que je suive le lien ci-dessus que tu proposes comme doc sur le sujet.
Je pense que j'essayerai par moi-même une mosaïque avec une image sur picturebox ou imagelist. En effet si toutes les images sont externes à l'exe le final user pourra à sa guise modifier l'interface.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
MisterN, je pense que l'on doit pouvoir transformer les coordonnées, mais je sais pas en détail comment...

Asimengo, je viens d'ajouter une mosaïque

Filou26, faut voir le code, j'ai pas de réponse générique...
filou26
Messages postés
37
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
16 juin 2008

bravo et merci
j'attendais un truc de ce genre depuis longtemps
j'ai le niveau débutant mais je vois très bien le parti
qu'on peut tirer de la gdi+ : énorme
par contre j'ai essayé de charger une grosse image .tiff
genre plan 12000/8000 en noir blanc l'image monte impec ,même dans une picture box !! INCROYABLE
le souci ,-parcequ'on est jamais content de ce qu'on a
même si on croyait pas ça possible y ' a 10 minutes-,c'est
que sur des images si grandes ,c'est lent
y'aurait il un moyen d'optimiser ce code pour le rendre plus rapide?en fait j'essaye de faire un zoom en dessinant l'image
aprés avoir redimensionné la largeur et hauteur mais ça va pas vite
misterN
Messages postés
40
Date d'inscription
samedi 21 août 2004
Statut
Membre
Dernière intervention
14 décembre 2012

Renfield>
Lorsque l'image est en rotation par ex. à 45°, les angles disparaissent.
Est-il possible de réduire l'image toujours à 45° pour qu'elle puisse s'inscrire dans son conteneur, et comment procéder?
Merci d'avance.
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

J'ai vu la source de SamirAloui http://www.vbfrance.com/codes/IMAGE-MOSAIQUE_39142.aspx, c'est déjà bien mais je dirais méthode manuelle, je suppose qu'il existe une API pour le faire.
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

@Renfield: une solution possible est de faire un brush avec ton image, de définir comment cela se passe pour en faire une mosaïque (WrapMode) et go...

Alors là, si c'est clair je ne pige anything. Si c'est pas trop demandé d'avoir un exemple (mosaique sur clic droit par exemple).
misterN
Messages postés
40
Date d'inscription
samedi 21 août 2004
Statut
Membre
Dernière intervention
14 décembre 2012

Renfield>
Action...réaction...
Un mot,
MERCI !!!
MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

Pfff excellent, mortel, vraiment génial !!!!

Je garde ce code sous la main ça risque de bouleverser pas mal de choses dans mes prog ^^

Merci !
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Pour ceux qui cherchent la Doc sur ces APIs:

http://windowssdk.msdn.microsoft.com/en-us/library/ms533969.aspx
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Mis a jour MisterN, avec un nouveau parametre permettant la rotation de l'image
(rotation du monde, ici)
misterN
Messages postés
40
Date d'inscription
samedi 21 août 2004
Statut
Membre
Dernière intervention
14 décembre 2012

Renfield>
Utile et précis, comme d'hab...
Pour la rotation à 45°, est-ce que tu peux faire un exemple, si c'est possible et rapide via GDI+.
Merci d'avance.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
une image en mosaïque ?
oui, bien sur....

une solution possible est de faire un brush avec ton image, de définir comment cela se passe pour en faire une mosaïque (WrapMode) et go...
cavo789
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
28 juillet 2009
1
Sympa ! Merci
cs_asimengo
Messages postés
281
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

une image en mosaïque est-elle possible dans un form dans VB?
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
à noter que GDI+ (par default sur Xp, au moins SP2) peut s'installer même sous Win95...

et que ce que j'ai montré ici n'est qu'une infime partie de ce que peux offrir GDI+
- anticrenelage
- transparence
- rotations, étirements...
- lecture/ecriture d'images dans divers formats
- animation de Gifs
- canal alpha (dessiner avec translucidité)
- degradés faciles
- etc...
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
le hDC nous permet de dessiner direct sur une surface ...
la plupart des contrôles en ont.

si tu n'en a pas a ta disposition, tu as peut être une propriété Picture...

et une conversion est nécessaire, alors
philippe laschweng 1
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
Salut,

Effectivement ta méthode est drôlement intéressante mais difficlement compréhensible pour un débutant comme moi... J'aime comprendre ce que j'utilise comme fonction mais là je séche !!!
L'utilisation de la fonction est bien entendu très simple mais le code...
Je n'est pas mis 10 car je ne suis pas arrivé à insérer l'image PNG dans la propriété Picture d'un CommandButton. C'est certainement possible et c'est certainement moi qui n'a pas la bonne ligne de code... Eclaire moi !

Ta source va surement aider pas mal de monde !

Salut
bouv
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019

Oui, J'aime bien.
Mais comment fait on quand le controle ne possède pas de propriété hDC ?