PIVOTER UN PICTUREBOX DE 90 DEGRÉS INSTANTANÉMENT (OU PRESQUE)

Signaler
Messages postés
37
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
23 avril 2004
-
Messages postés
50
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
14 avril 2005
-
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/8168-pivoter-un-picturebox-de-90-degres-instantanement-ou-presque

Messages postés
50
Date d'inscription
dimanche 9 février 2003
Statut
Membre
Dernière intervention
14 avril 2005

Salut!!! Il me plait beaucoup aussi cette source, je m'explique, j'aimerais faire un programme qui ouvre mon format image (qui ressemble beaucoup à du bmp mais sans l'entete) le probleme c'est que avec ma methode d'ouverture(lire le fichier octet par octet, au bout de 3 octets sa fait un pixel et afficher pixel par pixel sur la picturebox en utilisant la commande pset de la picturebox ) c'est tres lent, je supose donc que c'est à cause de la commande pset car je ne vois pas comment faire autrement que de traiter pixel par pixel, j'aurais donc aimer savoir comment fonctionne la commande LoadBmp de windows (enfin savoir le code et le langage) mais pas moyen de trouver la moindre explication sur internet, donc j'ai du garder ma methode de traitement pixek par pixel (c'est peut etre la meme que loadbmp mais je l'utilise peut etre mal), j'ai donc pensé à utiliser un buffer, et j'ai pas encore trop regarder ton prog mais sa a l'aire de pouvoir m'aider, si tu pense que oui et si t'as un moyen ton aide me ferais le plus grand bien. Merci. Autre chose dans ton code y a certains truc que tu sais pas à quoi sa sert, j'peux peut etre t'aider mais fait attentino car ce que j'dit n'est qu'une hypothese (enfin j'en suis presque certain mais on sais jamais j'me trompe peut etre), donc deja la ligne:
rgbReserved As Byte
il me semble que cette ligne est obligatoire car le format des pixels n'est pas en 24 bits mais en 32 bits, il y a donc un octet qui ne sert à rien(le rgbreserved), dans certains cas 32 bits comme dans dx7, ce byte sert au rgba (c'est le "a") c'est en fait la teinte de gris de la couleur rgb, en asm j'ai eut un probleme dans ce cadre : mon mode d'ecran ne pouvait etre qu'en 32 bits et je devais donc laisser un octet vide dans le buffer (ici le rgbreserved), voila j'espere que tu as compri
(souvent j'ai du mal à m'expliquer) et que sa t'as aider. (au niveau du BiPlanes, je sais pas exactement ce que c'est mais sa doit avoir un rapport avec soit la couleur grise soit un buffer : double....). J'espere que tu pourra m'aide en retour dans mon programme d'ouverture d'image en mon format.
Messages postés
175
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
8 mai 2017

Salut, marche nickel chez moi.

Mais peut on faire tourner l' image de quelques degrés à la place de 90 ? et si oui comment si prendre ?

Ciao
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007

J'ai essayé (win98) avec .biBitCount=24 et une image 24 bits mais ca ne fonctionne toujours pas.

Par contre, je me pose des questions sur le dimentionnement du buffer "Buffer () As RGBQUAD" avec 2 dimentions.
Dans le démo qui fonctionne pour moi le buffer est dimentionné ainsi:
bBytes() As Byte
ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
...mais c'est peut-être équivalent.

Il y a aussi les 2 premiers paramètres qui sont différents avec le démo qui fonctionne pour moi.
Le 1er:
Le démo utilise l'API CreateCompatibleDC() à la place de Pic1.hDC

Le 2è:
Le démo utilise l'API CreateDIBSection() à la place de Pic1.Picture.Handle

Ce 2è paramètre est très suspect à la lumière de ce que MSDN a écrit:
hbmp
[in] Handle to the bitmap. This must be a compatible bitmap (DDB).

Et cette image de la belle créature?
C'est dommage qu'elle soit intégré au picturebox car on ne peut pas aller lire ses infos pour connaître ses paramètres et savoir si elle est compatible.

Enfin, avec toutes ces pistes, c'est devenu relativement facile de trouver le problème. Surtout que nous avons un démo qui fonctionne et avec lequel nous pouvons comparer...
Messages postés
172
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
4 août 2005

Je n'ai sue XP chez moi, je ne saurais donc pas tester le prog sur d'autres systèmes. Sino, je me demande si l'erreur ne pourrait pas provenir du paramètre .biBitCount=32. Mais je ne saurais pas en dire plus pour le moment. Désolé.
Messages postés
201
Date d'inscription
mercredi 25 septembre 2002
Statut
Membre
Dernière intervention
10 novembre 2007

Ca ne fonctionne pas non plus sur win98... Fallait s'y attendre

La valeur retournée par les API SetDIBits & GetDIBits est 0.
Ceci veut dire qu'elles ont toutes les deux échoués.

J'ai fait la même chose avec un autre démo qui utilise GetDIBits et l'API n'a pas échoué.

CONCLUSION: Ce sont les paramètres qui sont indigestes pour Win98, Me, NT

Voici le démo en question (provient de API-Guide) en espérant que cela puisse te donner des indices:
-------------------------------------------------------------------------------
Private Const BI_RGB = 0&
Private Const DIB_RGB_COLORS = 0 ' color table in RGBs
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Dim iBitmap As Long, iDC As Long
Private Sub Form_Paint()
'KPD-Team 2000
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
'-> Compile this code for better performance
Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
With bi24BitInfo.bmiHeader
.biBitCount = 24
.biCompression = BI_RGB
.biPlanes = 1
.biSize = Len(bi24BitInfo.bmiHeader)
.biWidth = 100
.biHeight = 100
End With
ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
iDC = CreateCompatibleDC(0)
iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
SelectObject iDC, iBitmap
BitBlt iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, GetDC(0), 0, 0, vbSrcCopy
GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
For Cnt = LBound(bBytes) To UBound(bBytes)
If bBytes(Cnt) < 50 Then
bBytes(Cnt) = 0
Else
bBytes(Cnt) = bBytes(Cnt) - 50
End If
Next Cnt
SetDIBitsToDevice Me.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
DeleteDC iDC
DeleteObject iBitmap
End Sub
-------------------------------------------------------------------------------
Messages postés
406
Date d'inscription
lundi 2 décembre 2002
Statut
Membre
Dernière intervention
25 janvier 2014

re . je l'ai testé sur XP ya pas de probléme , mais sur millenium cela ne marche pas . prob d'aspi sans doute .10/10 pour le code tres bien expliqué .
Messages postés
172
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
4 août 2005

->clementpat : Je pige pas ce qui peut se passer, tout fonctionne chez moi (avec la source que j'ai retéléchargé sur le site pour être sûr). Théoriquement, les API utilisées doivent fonctionner avec tous les Windows possibles et j'ai moi aussi VB6 entreprise.
Donc, là comme ça je saurais pas t'aider, désolé.

Bonne prog.
MoiOlivier.
Messages postés
406
Date d'inscription
lundi 2 décembre 2002
Statut
Membre
Dernière intervention
25 janvier 2014

salut a toi , programme tres bien commenté ,
mais il ne fonctionne pas chez moi .
quand je clic sur pivoter droite ou pivoter gauche , cela me reduit la picture box , et me cache simplement les AILES de la fille .
aucune rotation ! je suis sous vb6 entreprise et windows millenium !!!
Messages postés
386
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
19 février 2018
2
Bijour,

Le c'est juste pour le nombre de couleur.

A++
[Gally Home Corp]
Messages postés
37
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
23 avril 2004

Justement je cherchais a faire ca, et les sources que j'avais pu voir jusqu'a maintenant n'etaient soit pas clair, soit trop lourdes a mettre en place.
Les deux subs(buffer) me plaisent bien ca me servira aussi pour autre chose.

Duss