Pivoter un picturebox de 90 degrés instantanément (ou presque)

Description

Bon, alors voilà. Ceci est le premier code que je dépose, mais je me devais de le faire puisque j'ai honteusement pompé certaines fonctions dans une source de AntiSlash (http://www.vbfrance.com/article.aspx?ID=6541). Donc merci à lui.
Sinon ça sert juste à faire pivoter une image de 90 degrés vers la gauche ou vers la droite.

Source / Exemple :


Private Declare Function SetDIBits Lib "gdi32" (ByVal hdc 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 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 Type BITMAPINFOHEADER
    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         'PS : si quelqu'un sait à quoi ça sert, je suis preneur
End Type
Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type
Dim BMPINFO As BITMAPINFO
Dim BMPINFOH As BITMAPINFOHEADER

Private Buffer() As RGBQUAD     'tampon dans lequel on place l'image d'un PictureBox

'procédure pour placer l'image dans le tampon
'PichDC : hDC du PictureBox concerné
'PicImHandle : handle de l'image contenue dans le PictureBox
'x,y : Largeur et hauteur de l'image en Pixels
Public Sub PicToBuffer(PichDC As Long, PicImHandle As Long, x As Long, y As Long)
ReDim Buffer(x, y)
With BMPINFOH
    .biBitCount = 32        'profondeur de couleur
    .biHeight = y + 1       'on doit rajouter 1 parceque l'index commence à 0
    .biWidth = x + 1
    .biPlanes = 1           'PS : si quelqu'un sait à quoi ça sert, je suis preneur
    .biSize = Len(BMPINFOH)
End With
BMPINFO.bmiHeader = BMPINFOH

'on met les données du Bitmap dans le tableau
GetDIBits PichDC, PicImHandle, 0, y + 1, Buffer(0, 0), BMPINFO, 0
End Sub

'procédure pour afficher le tampon dans un PictureBox
'PichDC : hDC du PictureBox concerné
'PicImHandle : handle de l'image contenue dans le PictureBox
Public Sub BufferToPic(PichDC As Long, PicImHandle As Long)
Dim x As Long
Dim y As Long
'on prend les dimensions de l'image (et donc du tampon)
x = UBound(Buffer, 1)
y = UBound(Buffer, 2)
With BMPINFOH
    .biBitCount = 32
    .biHeight = y + 1
    .biWidth = x + 1
    .biPlanes = 1
    .biSize = Len(BMPINFOH)
End With
BMPINFO.bmiHeader = BMPINFOH
'on affiche...
SetDIBits pihdc, PicImHandle, 0, y + 1, Buffer(0, 0), BMPINFO, 0
End Sub

Conclusion :


En résumé, voilà ce qu'il se passe: vous chargez une image dans un PictureBox, puis lorsque vous voulez la faire pivoter, le prog la met dans un tampon mémoire (un tableau à deux dimensions) puis la fait pivoter. L'utilisation du tampon et la manipulation du tableau permet d'aller beaucoup plus vite qu'avec les fonctions standards.
Ca peut servir de base pour un prog de retouche d'images... Je crois...

Siouplait, soyez indulgent dans les commentaires, c'est ma première source.
Bonne prog.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.