cs_youcef09
Messages postés1Date d'inscriptionsamedi 18 juillet 2009StatutMembreDernière intervention20 novembre 2012 20 nov. 2012 à 11:07
bonjour
dans le cas où mon fichier tif est composé en plusieurs pages es ce que ce programme l'affiche
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 20 juil. 2011 à 18:48
LA mise à l'échelle se fait mal avec les wmf mais je ne trouve pas comment corriger.
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 20 juil. 2011 à 18:18
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
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és221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 20 juil. 2011 à 17:40
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
Maintenant ceci marche.
J'ai toujours les problèmes d'effacement et de conversion de coordonnées.
cs_VinceVG
Messages postés221Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention30 mars 2016 20 juil. 2011 à 15:32
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és1Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention17 juillet 2011 17 juil. 2011 à 15:31
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és102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012 8 avril 2011 à 14:56
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 8 avril 2011 à 11:13
je dirai...
création d'une fenetre translucide superposée...
andalo
Messages postés102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012 8 avril 2011 à 10:35
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és300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 28 févr. 2011 à 16:37
Heu... autant pour moi, je dois avoir les yeux qui louchent...
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 28 févr. 2011 à 16:35
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 19 févr. 2011 à 21:25
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és300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 19 févr. 2011 à 16:06
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 févr. 2011 à 22:59
j'ai restructure le code, ca devrait t'aider
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 18 févr. 2011 à 19:55
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és300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 18 févr. 2011 à 19:03
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 18 févr. 2011 à 11:58
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és300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 18 févr. 2011 à 09:03
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 17 févr. 2011 à 20:35
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és300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 17 févr. 2011 à 17:52
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 8 févr. 2011 à 11:01
Je t'ai ajouté un exemple d'image stockée dans un .res
j'ai remanié un peu le code, également
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 8 févr. 2011 à 08:17
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 7 févr. 2011 à 17:17
le plus simple serai un fichier .RES
apres on doit pouvoir s'en sortir avec un stream (CreateStreamONHGlobal)
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 7 févr. 2011 à 15:51
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és27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 3 juil. 2010 à 21:13
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 juil. 2010 à 19:39
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 :
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 3 juil. 2010 à 19:26
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és27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 3 juil. 2010 à 18:59
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 juil. 2010 à 17:33
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és27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 3 juil. 2010 à 15:17
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 juil. 2010 à 00:23
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és27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 2 juil. 2010 à 22:31
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 2 juil. 2010 à 20:55
ptard
Messages postés27Date d'inscriptiondimanche 5 novembre 2006StatutMembreDernière intervention30 septembre 2011 2 juil. 2010 à 19:39
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 mars 2010 à 07:31
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és34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 4 mars 2010 à 23:32
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 3 mars 2010 à 19:09
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és34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 3 mars 2010 à 05:48
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 1 mars 2010 à 07:03
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és34Date d'inscriptionsamedi 3 juin 2006StatutMembreDernière intervention23 avril 2011 1 mars 2010 à 03:59
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 28 déc. 2009 à 11:02
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és89Date d'inscriptionvendredi 16 mars 2007StatutMembreDernière intervention23 février 2010 28 déc. 2009 à 10:55
Je viens seulement de tomber sur cette source et je vais faire mes premiers pas avec GDI+ grâce à elle.
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 19 nov. 2008 à 21:09
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és3Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention19 novembre 2008 19 nov. 2008 à 11:32
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 19 nov. 2008 à 07:56
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és10Date d'inscriptionmardi 12 octobre 2004StatutMembreDernière intervention16 novembre 2008 16 nov. 2008 à 20:34
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 16 nov. 2008 à 14:19
... je viens de tester (avec Winrar) et no soucy ...
tilp
Messages postés10Date d'inscriptionmardi 12 octobre 2004StatutMembreDernière intervention16 novembre 2008 16 nov. 2008 à 10:08
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 14 nov. 2007 à 07:11
par un tableau de Byte ?
tu peux passer par un objet Stream (createStreamOnHGlobal & co)
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 14 nov. 2007 à 00:22
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és21Date d'inscriptionmardi 10 décembre 2002StatutMembreDernière intervention30 octobre 2007 30 oct. 2007 à 10:51
Merci sa venai bien de l'AutoRedraw de la picturebox :)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 30 oct. 2007 à 07:28
joue avec ton Picture1.AutoRedraw
ou dessine dans le Picture1_Paint
psycho69
Messages postés21Date d'inscriptionmardi 10 décembre 2002StatutMembreDernière intervention30 octobre 2007 29 oct. 2007 à 22:50
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és552Date d'inscriptionjeudi 12 octobre 2006StatutNon membreDernière intervention24 janvier 20234 3 oct. 2007 à 17:31
Excellent !
anackan
Messages postés4Date d'inscriptionsamedi 4 décembre 2004StatutMembreDernière intervention 7 mars 2007 7 mars 2007 à 19:06
Merci pour la réponse,
Ca marche c cool,
;)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 mars 2007 à 20:33
Form1.cls
anackan
Messages postés4Date d'inscriptionsamedi 4 décembre 2004StatutMembreDernière intervention 7 mars 2007 5 mars 2007 à 09:29
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és1Date d'inscriptionjeudi 29 juin 2006StatutMembreDernière intervention31 janvier 2007 31 janv. 2007 à 16:39
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és278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 23 janv. 2007 à 11:56
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 !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 22 janv. 2007 à 23:52
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és278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 22 janv. 2007 à 21:25
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és625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 7 nov. 2006 à 19:19
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 7 nov. 2006 à 18:14
j'ai testé, mis ca après mon Me.Refresh,
dans le Form_MouseDown du projet de test
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 7 nov. 2006 à 18:05
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 7 nov. 2006 à 07:40
tu peux faire :
Set Picture1.Picture = Me.Image
ou
SavePicture Me.Image, "C:\a.bmp"
pour enregistrer dans un fichier
draluorg
Messages postés625Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention25 novembre 2010 6 nov. 2006 à 22:11
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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 24 oct. 2006 à 15:28
Difficile de faire plus simple.
Merci
++
B0mbJacK
Messages postés141Date d'inscriptionlundi 23 février 2004StatutMembreDernière intervention25 octobre 20061 22 oct. 2006 à 05:26
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és6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 12 oct. 2006 à 07:38
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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 mars 2009 10 oct. 2006 à 15:12
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 10 oct. 2006 à 14:30
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és37Date d'inscriptionmercredi 26 novembre 2003StatutMembreDernière intervention16 juin 2008 7 oct. 2006 à 20:33
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és40Date d'inscriptionsamedi 21 août 2004StatutMembreDernière intervention14 décembre 2012 6 oct. 2006 à 12:03
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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 mars 2009 5 oct. 2006 à 20:18
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 oct. 2006 à 13:50
Mis a jour MisterN, avec un nouveau parametre permettant la rotation de l'image
(rotation du monde, ici)
misterN
Messages postés40Date d'inscriptionsamedi 21 août 2004StatutMembreDernière intervention14 décembre 2012 5 oct. 2006 à 12:45
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 oct. 2006 à 12:41
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és168Date d'inscriptionvendredi 9 janvier 2004StatutMembreDernière intervention28 juillet 20091 5 oct. 2006 à 12:27
Sympa ! Merci
cs_asimengo
Messages postés280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 mars 2009 5 oct. 2006 à 11:26
une image en mosaïque est-elle possible dans un form dans VB?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 oct. 2006 à 09:17
à 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 5 oct. 2006 à 09:14
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és278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 5 oct. 2006 à 09:11
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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 5 oct. 2006 à 09:09
Oui, J'aime bien.
Mais comment fait on quand le controle ne possède pas de propriété hDC ?
20 nov. 2012 à 11:07
dans le cas où mon fichier tif est composé en plusieurs pages es ce que ce programme l'affiche
20 juil. 2011 à 18:48
20 juil. 2011 à 18:18
'# 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
20 juil. 2011 à 17:40
Et j'ai modifié l'appel de la fonction GDI+ :
Maintenant ceci marche.
J'ai toujours les problèmes d'effacement et de conversion de coordonnées.
20 juil. 2011 à 15:32
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.
17 juil. 2011 à 15:31
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
8 avril 2011 à 14:56
http://www.codyx.org/snippet_rendre-form-transparente-translucide_852_l_vb6_1.aspx
merci
8 avril 2011 à 11:13
création d'une fenetre translucide superposée...
8 avril 2011 à 10:35
28 févr. 2011 à 16:37
28 févr. 2011 à 16:35
Private Declare Function GdipDisposeImageAttributes Lib "gdiplus" (ByVal imageattr As Long) As Long
cordialement,
19 févr. 2011 à 21:25
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
19 févr. 2011 à 16:06
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
18 févr. 2011 à 22:59
18 févr. 2011 à 19:55
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 ?
18 févr. 2011 à 19:03
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,
18 févr. 2011 à 11:58
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)
18 févr. 2011 à 09:03
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,
17 févr. 2011 à 20:35
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
17 févr. 2011 à 17:52
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 ?
8 févr. 2011 à 11:01
j'ai remanié un peu le code, également
8 févr. 2011 à 08:17
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,
7 févr. 2011 à 17:17
apres on doit pouvoir s'en sortir avec un stream (CreateStreamONHGlobal)
7 févr. 2011 à 15:51
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,
3 juil. 2010 à 21:13
3 juil. 2010 à 19:39
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
3 juil. 2010 à 19:26
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.
3 juil. 2010 à 18:59
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
3 juil. 2010 à 17:33
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
3 juil. 2010 à 15:17
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
3 juil. 2010 à 00:23
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...
2 juil. 2010 à 22:31
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
2 juil. 2010 à 20:55
http://www.vbfrance.com/codes/COULEUR-DANS-RICHTEXTBOX-SANS-MODIFIER-SELSTART-SELLENGTH-SMILEYS_50952.aspx
2 juil. 2010 à 19:39
Cela marche vraiment tres bien, j'aimerais faire la même chose en inserant le png dans une
richtextbox
Merci pour une idée.
5 mars 2010 à 07:31
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é...
4 mars 2010 à 23:32
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+ ?
3 mars 2010 à 19:09
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
3 mars 2010 à 05:48
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.
1 mars 2010 à 07:03
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'
1 mars 2010 à 03:59
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.
28 déc. 2009 à 11:02
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.
28 déc. 2009 à 10:55
Très bonne base pour apprendre...
Bravo et merci.
18 mars 2009 à 14:07
18 mars 2009 à 12:16
Add 1, Text:="Texte bateau"
evite ce genre de notations :
Add 1,,,,,"Texte bateau"
18 mars 2009 à 12:10
:=nTransparency // :=nAngle, Hein ? Ça veux dire quoi ? J'ai jamais vu ça sur Vb Moi :s
19 nov. 2008 à 21:09
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
19 nov. 2008 à 11:32
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.
19 nov. 2008 à 07:56
ou sans propriété hdc ?
si tu as un hWnd, tu peut demander un hDc (via GetDC. a liberer via ReleaseDc)
16 nov. 2008 à 20:34
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.
16 nov. 2008 à 14:19
16 nov. 2008 à 10:08
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.
14 nov. 2007 à 07:11
tu peux passer par un objet Stream (createStreamOnHGlobal & co)
14 nov. 2007 à 00:22
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)
30 oct. 2007 à 10:51
30 oct. 2007 à 07:28
ou dessine dans le Picture1_Paint
29 oct. 2007 à 22:50
3 oct. 2007 à 17:31
7 mars 2007 à 19:06
Ca marche c cool,
;)
5 mars 2007 à 20:33
5 mars 2007 à 09:29
Merci.
31 janv. 2007 à 16:39
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
23 janv. 2007 à 11:56
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
22 janv. 2007 à 23:52
Son ScaleMode également...
pour l'affichage d'un PNG dans une pictureBox, regarde la fonction DrawImage...
22 janv. 2007 à 21:25
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
7 nov. 2006 à 19:19
le probleme vient donc de chez moi :(
Sorry d'avoir pris de ton temps pour rien et merci d'avoir repondu
++
7 nov. 2006 à 18:14
dans le Form_MouseDown du projet de test
7 nov. 2006 à 18:05
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 :(
7 nov. 2006 à 07:40
Set Picture1.Picture = Me.Image
ou
SavePicture Me.Image, "C:\a.bmp"
pour enregistrer dans un fichier
6 nov. 2006 à 22:11
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...
++
24 oct. 2006 à 15:28
Merci
++
22 oct. 2006 à 05:26
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
12 oct. 2006 à 07:38
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 ;)
10 oct. 2006 à 15:12
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.
10 oct. 2006 à 14:30
Asimengo, je viens d'ajouter une mosaïque
Filou26, faut voir le code, j'ai pas de réponse générique...
7 oct. 2006 à 20:33
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
6 oct. 2006 à 12:03
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.
5 oct. 2006 à 20:18
5 oct. 2006 à 20:02
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).
5 oct. 2006 à 14:44
Action...réaction...
Un mot,
MERCI !!!
5 oct. 2006 à 14:21
Je garde ce code sous la main ça risque de bouleverser pas mal de choses dans mes prog ^^
Merci !
5 oct. 2006 à 13:51
http://windowssdk.msdn.microsoft.com/en-us/library/ms533969.aspx
5 oct. 2006 à 13:50
(rotation du monde, ici)
5 oct. 2006 à 12:45
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.
5 oct. 2006 à 12:41
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...
5 oct. 2006 à 12:27
5 oct. 2006 à 11:26
5 oct. 2006 à 09:17
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...
5 oct. 2006 à 09:14
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
5 oct. 2006 à 09:11
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
5 oct. 2006 à 09:09
Mais comment fait on quand le controle ne possède pas de propriété hDC ?