patricktoulon
XLDnaute Barbatruc
Bonjour a tous
je met un peu a jour mon xlam utilitaire
et parmis ces fonctions j'en ai une avec les api qui me permet d'enregistrer une shape avec les api et GDI+ en format png
sauf que la capture se fait en bitmap il est donc clair que je n'aurais pas la transparence au moins dans les place vide qu'occupe le rectangle d'une shape quel que soit sa forme
même si elle est bien utile j'aimerais trouver le bon code pour garder les partie transparente et non sur un fond blanc
voi ma fonction
pour le coup je l'ai remis un peu au propre
je met un peu a jour mon xlam utilitaire
et parmis ces fonctions j'en ai une avec les api qui me permet d'enregistrer une shape avec les api et GDI+ en format png
sauf que la capture se fait en bitmap il est donc clair que je n'aurais pas la transparence au moins dans les place vide qu'occupe le rectangle d'une shape quel que soit sa forme
même si elle est bien utile j'aimerais trouver le bon code pour garder les partie transparente et non sur un fond blanc
voi ma fonction
pour le coup je l'ai remis un peu au propre
VB:
'*****************************************************************************************************
' ___ _ _______ __ _ ____ _ _ _______ ___ _ _ _ ___ _ _.
' // \\ /\\ // // \\ // // // // // // \\ // // // // \\ //| //
' //___// //__\ // //__// // // //__// // // // // // // // // // | //
' // // \\ // // \\ // // // \\ // // // // // // // // // | //
'// // // // // // // //___ // \\ // \\__// //__// //___ \\__// // |//
'****************************************************************************************************
'capturer une plage ou shape ou picture en bitmap et créer un fichier image en png
'patricktoulon exceldownloads
'utilisation d'un clisd pour la structure IPictureIID png
'date 04/06/2016
'code remastered date: 09/11/2024
'abandon du vb6
Private Declare PtrSafe Function GdiplusStartup Lib "gdiplus" (ByRef token As LongPtr, inputbuf As Any, ByVal outputbuf As LongPtr) As Long
Private Declare PtrSafe Function GdiplusShutdown Lib "gdiplus" (ByVal token As LongPtr) As Long
Private Declare PtrSafe Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" (ByVal hbm As LongPtr, ByVal hpal As LongPtr, ByRef bitmap As LongPtr) As Long
Private Declare PtrSafe Function GdipSaveImageToFile Lib "gdiplus" (ByVal image As LongPtr, ByVal filename As LongPtr, clsidEncoder As Any, ByVal encoderParams As LongPtr) As Long
Private Declare PtrSafe Function GdipDisposeImage Lib "gdiplus" (ByVal image As LongPtr) As Long
Private Declare PtrSafe Function CLSIDFromString Lib "ole32" (ByVal strCLSID As LongPtr, ByRef pClsid As GUID) As Long
Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As LongPtr
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Function CopyPngPicture(obj As Object, lPath As String)
Dim hCopy As LongPtr, token As LongPtr, bitmap As LongPtr, CLSID_PNG As GUID, StartupInput As GdiplusStartupInput
StartupInput .GdiplusVersion = 1 ' Démarrer GDI+
If GdiplusStartup(token, StartupInput, 0&) <> 0 Then Exit Function 'si GDI+ n'est pas ok on sort
obj.CopyPicture format:=xlBitmap ' Copier l'image en Bitmap
OpenClipboard 0 'ouverture clipboard
hCopy = GetClipboardData(&H2) 'recupération du handle du bitmap dans le clipboard
CloseClipboard 'fermeture clipboard
If hCopy = 0 Then GoTo byebye ' si pas de handle bitmap on se casse
If GdipCreateBitmapFromHBITMAP(hCopy, 0&, bitmap) <> 0 Then GoTo byebye ' Créer un bitmap GDI+ à partir du handle hcopy
CLSIDFromString StrPtr("{557CF406-1A04-11D3-9A73-0000F81EF32E}"), CLSID_PNG ' Obtenir le CLSID en longPtr pour le format PNG
If GdipSaveImageToFile(bitmap, StrPtr(lPath), CLSID_PNG, 0&) <> 0 Then GoTo byebye ' Enregistrer l'image au format PNG
byebye:
' comme ça n'a pas fonctionner alors un coup pelle aux variables
If bitmap Then GdipDisposeImage bitmap
GdiplusShutdown token
End Function