IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

sauvegarder une shape ou range ou picture en png +transparence


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 192
    Points : 328
    Points
    328
    Par défaut sauvegarder une shape ou range ou picture en png +transparence
    Bonjour à tous
    dans le but de compléter mon xlam utilitaire,je souhaite ajouter la sauvegarde d'une shape ou range ou picture en png
    avec les api & GDI+
    en effet j'ai une solution qui fonctionne très bien avec un graphique et qui me permet de garder la transparence et !! semie transparence malheureusement sur les version récentes d'excel on voit bien que les latences clipboard posent problème
    ce que sommes toute ;se gèrent assez facilement mais rallonge le temps d'exécution bien évidemment

    j'ai actuellement un code fonctionnel avec les api win et GDI sauf que la capture se fait en xlbitmap parti de là vous comprendrez que l'on ne peut plus parler de transparence

    je joins donc ce code fonctionnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    'patricktoulon
    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
    Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
    Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
    Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As LongPtr
    Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) 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_GDI_V_1(obj As Object, lPath As String) As Variant
        Dim hCopy As LongPtr, token As LongPtr, bitmap As LongPtr
        Dim CLSID_PNG As GUID, StartupInput As GdiplusStartupInput
        Dim retries As Integer, isimage&
     
        On Error GoTo ErrorHandler
     
        ' Initialiser GDI+
        StartupInput.GdiplusVersion = 1
        If GdiplusStartup(token, StartupInput, 0&) <> 0 Then Exit Function
     
        ' Effacer et préparer le clipboard pour éviter les erreurs d'accès
        OpenClipboard 0: EmptyClipboard: CloseClipboard
        DoEvents
     
        ' Copier la sélection en bitmap
        obj.CopyPicture format:=xlBitmap
     
        'Attendre que le bitmap soit disponible dans le clipboard environ 1 seconde max
        'pour une gestion d'attente raisonnable
        'au delà il y a des problèmes à régler
        retries = 0
        Do Until isimage <> 0 Or retries >= 1000: isimage = IsClipboardFormatAvailable(&H2)
            retries = retries + 1
         Loop
        If isimage = 0 Then GoTo ByeBye
     
        ' Ouvrir le clipboard pour récupérer le bitmap
        OpenClipboard 0: hCopy = GetClipboardData(&H2): CloseClipboard
     
        ' Si le handle est invalide, quitter
        If hCopy = 0 Then GoTo ByeBye
     
        ' Créer un bitmap GDI+ à partir du handle
        If GdipCreateBitmapFromHBITMAP(hCopy, 0&, bitmap) <> 0 Then GoTo ByeBye
     
        ' Obtenir le CLSID pour le format PNG
        CLSIDFromString StrPtr("{557CF406-1A04-11D3-9A73-0000F81EF32E}"), CLSID_PNG
     
        ' Sauvegarder l'image en fichier PNG
        If GdipSaveImageToFile(bitmap, StrPtr(lPath), CLSID_PNG, 0&) = 0 Then
            CopyPngPicture_GDI_V_1 = lPath ' Sauvegarde réussie
        End If
     
    ByeBye:
        ' Libérer la mémoire du bitmap et fermer GDI+
        If bitmap Then GdipDisposeImage bitmap
        GdiplusShutdown token
        Exit Function
     
    ErrorHandler:
        ' Gestion d'erreur basique
        CopyPngPicture_GDI_V_1 = False
        Resume ByeBye
    End Function
    y a t il un autre moyen de faire pour garder les parties complétement transparentes et demie transparentes(translucide)
    merci pour les futurs retours

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 146
    Points : 9 723
    Points
    9 723
    Par défaut
    Hello,
    Citation Envoyé par patmeziere Voir le message
    Bonjour à tous
    y a t il un autre moyen de faire pour garder les parties complétement transparentes et demie transparentes(translucide)
    merci pour les futurs retours
    Tu es sûr qu'en passant par le presse-papier tu peux récupérer la transparence ?
    Voilà ce que me dit Léo l'I.A de Brave à ce sujet :
    La transparence du presse-papiers fait référence à la capacité de préserver les informations du canal alpha (transparence) lors de la copie et du collage d'images entre applications. Malheureusement, le presse-papiers Windows ne prend pas en charge la transparence, ce qui peut entraîner des problèmes lors de la tentative de coller des images transparentes dans certains programmes.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre averti
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 192
    Points : 328
    Points
    328
    Par défaut re
    Bonjour jurassic pork
    c'est bien ce que je dis cette solution n'est pas bonne
    d'une part car le presse papier n'est pas capable de sauvegarder les vecteur alpha
    et d'autre part copypicture xlbitmap élimine en lui même la possibilité d' avoir un fichier final qui ai gardé les parties transparentes
    c'est pour ca que je demande
    ChatGPT mas donné quelque indice mais au bout d'un moment ca devient le bronx dans ces micopuces
    Selon lui le principe serait de créer et dessiner l'image avec les data d'un simple copy pour une shape par exemple

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 146
    Points : 9 723
    Points
    9 723
    Par défaut
    J'ai un truc intéressant à creuser :
    Copier XLBitmap ou XLPicture Transparence
    Lorsque vous copiez une image dans Excel en utilisant le CopyPicture méthode, vous pouvez spécifier le format comme xlBitmap ou xlPicture. Les deux formats ont des implications différentes pour la transparence.


    xlBitmap: Lorsque vous définissez le Format paramètre à xlBitmap, l'image copiée sera une image raster (bitmap) avec une couleur d'arrière-plan fixe. Cela signifie que toute transparence dans l'image d'origine sera perdue et que l'arrière-plan sera rempli de la couleur spécifiée (généralement blanche). Si vous avez besoin de préserver la transparence xlBitmap ce n'est pas le choix recommandé.
    xlPicture: En revanche, lorsque vous définissez le Format paramètre à xlPicture, l'image copiée sera un métafichier amélioré (EMF) ou une image métafichier Windows (WMF), qui prend en charge la transparence. Ce format préserve la transparence de l'image originale, vous permettant de maintenir l'arrière-plan ou d'utiliser un arrière-plan transparent dans l'application de destination.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre averti
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 192
    Points : 328
    Points
    328
    Par défaut re
    re @jurassic pork
    heu...oui je sais déjà tout ça
    ???????????
    c'est le reste qui ne fonctionne pas avec xlpicture

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 146
    Points : 9 723
    Points
    9 723
    Par défaut
    Hello
    Bon En fait quand on fait un Copy d'une forme Excel , on retrouve dans le presse-papier différents formats dont des formats propriétaires comme le PNG sous forme de stream, c'est à dire que cela correspond à un binaire d'un fichier PNG :


    Dans une nouvelle version de ma dll d'interfaçage vba-dotnet , j'ai rajouté pour le presse-papier la fonction SaveDataTofile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Sub SauveForme()
    Dim pp As Object, dataObject As Object
    Set pp = CreatePressePapierClass()
    pp.Clear
    Worksheets("Formes").Shapes("Cercle").Copy
    'on sauvegarde les données d'un format du pressepapier dans un fichier
    pp.SaveDataToFile "PNG", "d:\tmp\dataObject.png"
    End Sub
    
    Voici ce que j'obtiens avec une forme Cercle dans Excel avec un fond transparent et de la transparence dans la couleur de remplissage :




    On doit pouvoir faire la même chose en VBA. Le principe : dans le clipboard on fait un getData pour le format "PNG" , on récupère alors une memorystream et on écrit la memorystream dans un fichier.



    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Membre averti
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 192
    Points : 328
    Points
    328
    Par défaut re
    Bonjour jurassic pork
    c'est exactement ce que m'a dit chatGPT
    un simple .copy
    mais les api gdidispose et autres on besoin d'un stdolepicture autrement un ipicturedisp
    j'ai déjà ça pour le wmf ou bitmap
    peut être faudra il que je mixes les deux avec le wmf olecreatepicture et renvoie dans gdidispose

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 146
    Points : 9 723
    Points
    9 723
    Par défaut
    Hello,
    voir la solution ici
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Sauvegarder une Base de données Oracle 8
    Par benjamin50 dans le forum Administration
    Réponses: 7
    Dernier message: 16/06/2009, 12h36
  2. Réponses: 2
    Dernier message: 25/04/2005, 10h55
  3. Sauvegarder une couleur dans un champ Alphanum
    Par Harry dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/07/2004, 12h21
  4. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 12h58
  5. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo