DLL: Problème de création dans vb

Signaler
Messages postés
38
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
1 mai 2006
-
Messages postés
61
Date d'inscription
dimanche 21 juillet 2002
Statut
Membre
Dernière intervention
23 avril 2003
-
Salut, j'ai un petit problème avec les DLL.
Bon, je m'explique:
j'ai crée une fonctions dans un module, qui permet d'eclaicir des images. Ma fonction marche à merveille :) . Etant donné que l'eclaircissement se fait pixel par pixel, l'operation se fait avec une certaine lenteur pour des grand picture ...
C'est pour cela que je veux créer un DLL(il parait que c'est plus rapide).
Donc, j'ai créé un projet ActiveX DLL, j'ai copié tout les codes de ma fonction dans "la feuille vierge"
Mais lors dans la compilation, on me renvoie un erreur:
"Private object modules cannot be used in public object modules as parameters or return types for public procedures, as public data members, or as fields of public user defined types"

Cet erreur se produit sur la première ligne:
Function clair(PB As PictureBox)
Et pourtant dans mon modules, la meme fonction marchait très bien.

Pour conclure: j'aimerais savoir comment faire le DLL de ma fonction et surtout, comment le réutiliser dans mon programme (avec ses paramètres).

LOL: j'ai été un peu long, mais boff; c'est pour mieux me faire comprendre.

Merci d'avance pour vos réponse et au plaisir de vous lire !

10 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
C'est normal que tu obtienne une erreur car une fonctions de classe n'accepte pas (en tout cas, je ne pense pas) comme paramètre un contrôle de VB. En tout cas, si tu veux un conseille, envoie plutôt le handle du contrôle, et utilise les api pour tes modifications sur les images.
Quand à ton idée de rapidité grâce aux dll, je ne vois pas pourquoi une DLL en VB irait plus vite qu'une fonction VB si la syntaxe est la même...

DARK SIDIOUS
0
Messages postés
61
Date d'inscription
dimanche 21 juillet 2002
Statut
Membre
Dernière intervention
23 avril 2003

Pour que ton prog soit plus rapide, tu peux en effet faire une dll, mais en c++... ou bien si tu veux rester en vb, il faut que tu travaille directement avec les bits de couleurs de ton images, c'est a dire en n'utilisant pas les fonctions .point ou GetPixel (et toutes les autres...) . Si tu veux voir comment faire, regarde ma source:
http://www.vbfrance.com/article.aspx?Val=6541

Voilà, bonne prog !
@+
0
Messages postés
38
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
1 mai 2006

Merci AntiSlash pour ta réponse. J'ai telechargé ta source et je l'ai essayé (c'est impressionnant !).
Ca fait un mois que je programme en visual basic. Donc, je ne suis pas vraiment un pro. J'ai fourni des efforts pour comprendre ta source. Mais malgrès tes commentaires (clairs), je ne pige pas très bien ta façon de declarer tes fonctions et de les utiliser.
Je tiens vraiment à comprendre ta source. Alors, si c'est pas trop te demander, je vais te faire une requette :
Fait moi une petite fonction qui fait la moyenne des valeurs RGB "de picture1" et RGB de picture2. (L'important pour moi, c'est de bien comprendre l'utilisation des tableaux, des fonctions, de sorte que les effets graphiques soit accelerés)
Lol: je ne sais pas si je me suis fait comprendre ...
J'attend IMPATIENMENT ta réponse.
0
Messages postés
61
Date d'inscription
dimanche 21 juillet 2002
Statut
Membre
Dernière intervention
23 avril 2003

Voici un exemple pour te montrer comment eclaircir une image (ce tu veux faire il me semble). Copie cette source dans une nouvelle form avec un CommandButton et une Picture:

Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (refDest As Any, refFrom As Any, ByVal Longueur As Long)

Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private Type PicBmp
Size As Long
Type As Long
hBmp As Long
hPal As Long
Reserved As Long
End Type

Dim PicDef As PicBmp, IDispatch As GUID
Dim PicBits() As Long
Dim H As Long, W As Long
Dim Iobj As Long
Dim Ipict As IPictureDisp

Private Sub Command1_Click()
On Error Resume Next
'tableau pour RGB
Static TB(1 To 4) As Byte
'redimmensionne les tableau
ReDim PicBits(W, H) As Long
'Place les bits de couleurs de picture1 dans le tableau PicBits
GetBitmapBits Picture1.Image.Handle, (W * H * 4), PicBits(0, 0)

For x = 0 To W
For y = 0 To H
'Recup des valeurs rgb des picbits vers TB
RtlMoveMemory TB(1), PicBits(x, y), 4&
'Eclairci l'image (+10 par exemple)
PicBits(x, y) = RGB(TB(1) + 10, TB(2) + 10, TB(3) + 10)
Next y
Next x

'créé le nouveau bitmap
Iobj = CreateBitmap(W, H, 1, 32, PicBits(0, 0))
With IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
With PicDef
.Size = Len(PicDef)
.Type = vbPicTypeBitmap
.hBmp = Iobj
End With
OleCreatePictureIndirect PicDef, IDispatch, 1, Ipict
DeleteDC Iobj

'Place l'image dans picture1
Picture1.Picture = Ipict
End Sub

Private Sub Form_Load()
'Picture en Pixel
Picture1.ScaleMode = 3
'recup de la taille
H = Picture1.ScaleHeight
W = Picture1.ScaleWidth
End Sub

Voilà! Modifie-le pour l'adapter à ta source...
@+
0
Messages postés
38
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
1 mai 2006

Merci AntiSlash, de bien voulu m'aider ! :)
J'ai fait ceci:
J'ai crée un picutre box: Picture1
J'ai crée un bouton: command1
J'ai mit dans picture1 un petit image ...
Ensuite, j'ai copié l'integralité du code (sans modifier)
Lors de l'execution, il n'y aucune erreur retournée, mais seulement, l'image n'est pas eclairci !!! :sad)
(j'ai meme changé +10 dans le RGB, j'ai mis +30 (mais pas d'effet toujours)
Donc, essaie un peu d'executer le meme code chez toi, et dis moi après comment ça réagit
0
Messages postés
38
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
1 mai 2006

Ne tiens surtout pas compte du message precedent.
En fait, je boss dans un cyber, et j'ai essayé ton code dans un ordi, ou ça n'avait pas marché.
C'est pour cela que je t'ai ecrit.
Mais, dans un autre ordi, ça marche très bien !!!!!

MERCI encore !!!!
:big)
0
Messages postés
61
Date d'inscription
dimanche 21 juillet 2002
Statut
Membre
Dernière intervention
23 avril 2003

j'ai oublié de te le dire: si ca marche pas c'est parce qu'il faut changer un truc:

Iobj = CreateBitmap(W, H, 1, 32, PicBits(0, 0))

il faut changer le 32 par le mode de ton ordi (mode de couleurs: 16,24,32...)

voila!
@+
0
Messages postés
38
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
1 mai 2006

Salut antiSlash
Bon, j'ai étudié ton code, j'y ai meme apporté quelques modifications pour produire certains effet
par ex:
PicBits(x, y) = RGB(TB(1) * 2, TB(2) * 2, TB(3) * 2)
avec ça, j'obtiens l'augmentation du contraste !

Il y a un truc que j'aimerais comprendre: TB(1), TB(2) et TB(3) sont-ils les valeurs du pixels en cours ?

Je pose cette question parce qu'en faisant une petite modification pour reproduire un autre effet, ça ne marchait pas. Voila ce que j'ai fait :

For x = 0 To W
For y = 0 To H
'Recup des valeurs rgb des picbits vers TB
RtlMoveMemory TB(1), PicBits(x, y), 4&
'Eclairci l'image (+10 par exemple)

total = TB(1) + TB(2) + TB(3) 'calcul du total des couleurs
niveau = INT(total/3) 'c'est le niveau de gris

PicBits(x, y) = RGB(niveau, niveau, niveau)
Next y
Next x

Je m'attendais à voire mon picture en noir et blanc après l'exectution, mais je vois une surface toute grise (sans image !). C'est comme si le programme répendait partout le niveau de gris du premier pixel ...

c'est du à quoi ?
0
Messages postés
38
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
1 mai 2006

Pendant qu'on y est, je te souhaite un Joyeux Noel.

La vitesse d'execution de ton code est déchirante. J'y est beaucoup travaillé ces derniers temps. J'ai meme fait des modules pour les utiliser facilement dans mes programmes.
Sauf qu'il me reste un petit problème:
Je fait les effets spéciaux qui n'engage qu'une seule image comme paramètre. J'ai essayé de modifier ta source pour créer l'effet de fusion entre deux images. J'ai pas réussit ! Ce que j'aimerais savoir: c'est comment recuperer les couleurs RGB d'une deuxième images(c'est ce que j'ai pas réussit à faire). Faut il ajouter d'autres boucles ou comment ?

Merci d'avance pour tes eclairecissement .... :)
0
Messages postés
61
Date d'inscription
dimanche 21 juillet 2002
Statut
Membre
Dernière intervention
23 avril 2003

ca dépend, si les 2 images ont les memes dimensions, tu peux récuperer les couleurs RGB de la deuxieme image en meme temps que celles de la premiere (dans la meme boucle)... Mais si les images ont des dimensions différentes, il faut alors faire 2 boucles distinctes.
Exemple de recup de couleur RGB de 2 images differentes:

Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (refDest As Any, refFrom As Any, ByVal Longueur As Long)

Dim PicBits1() As Long, PicBits2() As Long
Dim H1 As Long, W1 As Long
Dim H2 As Long, W2 As Long
Dim TB(1 To 4) As Byte

'tableaux pour stocker les couleurs RGB des 2 images
Dim R1() As Integer, G1() As Integer, B1() As Integer
Dim R2() As Integer, G2() As Integer, B2() As Integer

Private Sub Command1_Click()Picture1.ScaleMode 3: Picture2.ScaleMode 3W1 Picture1.ScaleWidth: H1 Picture1.ScaleHeightW2 Picture2.ScaleWidth: H2 Picture2.ScaleHeight

ReDim PicBits1(W1, H1) As Long, PicBits2(W2, H2) As Long
ReDim R1(W1, H1) As Integer, G1(W1, H1) As Integer, B1(W1, H1) As Integer
ReDim R2(W2, H2) As Integer, G2(W2, H2) As Integer, B2(W2, H2) As Integer

GetBitmapBits Picture1.Image.Handle, (W1 * H1 * 4), PicBits1(0, 0)
GetBitmapBits Picture2.Image.Handle, (W2 * H2 * 4), PicBits2(0, 0)

'premiere boucle pour la premiere image
For x = 0 To W1
For y = 0 To H1
RtlMoveMemory TB(1), PicBits1(x, y), 4&R1(x, y) CInt(TB(3)): G1(x, y) CInt(TB(2)): B1(x, y) = CInt(TB(1))
Next y
Next x

'deuxieme boucle...
For x = 0 To W2
For y = 0 To H2
RtlMoveMemory TB(1), PicBits2(x, y), 4&R2(x, y) CInt(TB(3)): G2(x, y) CInt(TB(2)): B2(x, y) = CInt(TB(1))
Next y
Next x

End Sub

ce code récupere les couleurs RGB des 2 images (avec dimensions differentes) dans les tableaux R1,R2,B1...
Dans ma source de fusion d'image, les 2 images ont les memes dimensions, donc il n'y a qu'une seule boucle, et je ne stocke pas les couleurs rgb car je travaille directement avec dans la boucle (c'est plus rapide)... Voila
@+ et bonnes fetes

rem: si tu essaie de faire un prog qui manipule 2 images, je ne conseille pas de stocker les couleurs rgb comme fait cette source: travaille dans la boucle comme dans mon prog de fusion.
0