[Résolu][Basic]Transparence image

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Gerfaud
NOOuvel adepte
NOOuvel adepte
Messages : 20
Inscription : 18 nov. 2012 08:42

[Résolu][Basic]Transparence image

Message par Gerfaud »

Bonjour,

J'ai besoin de rendre transparentes les parties blanches d'une image.
Je cherche le code en basic.
J'ai identifié la commande utilisateur pour faire cela : Tools -> color replacer
qui ouvre un dialogue comportant les arguments pour faire le changement (couleur de depart, tolerance, couleur d'arrivée, alpha)
L'exploration de l'object image m'a permis de trouver la propriété Graphic
mais les propriétés de graphic sont en lecture seule.
J'ai identifié la commande du diptacher pour déclencher le dialogue "color deplacer": .uno:BmpMask
mais je ne sais pas comment remplir les argument en basic.
J'ai aussi identifier l'interface basic qui semble permettre de faire le changement :
com::sun::star::XGraphicTransformer
J'ai identifié la fonction dans cette interface : colorChange(….).
Cette fonction prend les mêmes arguments que ceux du dialogue "color replacer".
Mais je ne trouve pas cette fonction dans les methodes des objects que j'ai identifiés.

Dans quel object se trouve cette fonction ?
Ou, quel est la fonction basic équivalente à la fonction colorChange de l'interface XGraphicTransformer et de quel objet dépend-t-elle ?

Merci de vos réponses

Cordialement

Ci-joint un fichier avec un bouton pour déclencher la modification
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 16 avr. 2020 06:51, modifié 2 fois.
Raison : la balise [Résolu] doit être placée avant le balise [Basic]
Libre Office 6.3.5, 6.2.6, 5.3.7, 5.0.6.3,
MacOS X 10.11.6
Win 10
Gerfaud
NOOuvel adepte
NOOuvel adepte
Messages : 20
Inscription : 18 nov. 2012 08:42

Re: [Basic]Transparence image

Message par Gerfaud »

Bonjour,

Je continue de chercher un moyen de rendre le blanc d'une image transparent mais en basic.
Je suis médecin et je travaille sur un utilitaire de signature d'ordonnance sur libreOffice.
Il s'agit pour moi de mettre en forme la signature manuscrite d'un groupe de médecins qui travaillent en téléconsultation.
La plupart d'entre eux ne connaissent pas libreOffice et je veux donc limiter leurs interventions.
Je souhaite que leur premier usage de libreOffice soit très simple.
LibreOffice est très peu connu dans le monde de la santé libérale.

Mon fichier joint à évolué.
Il y a maintenant un bouton pour afficher le dialogue "color replacer" (menu Tools)
qui renvoi le dialogue de l'interface utilisateur et une boite de dialogue personnalisée pour valider.
Mais Il est nécessaire de cocher une des case-à-cocher pour que la manip fonctionne (c'est là que le code manque). Je voudrais pouvoir traiter le document sans l'intervention de l'utilisateur final.

Dans la macro ExploreDoc du document joint j'ai naïvement fait des essais pour associer l'interface XGraphicTransformer à mon object formImage.Graphic en utilisant la methode queryInterface :
formImage.Graphic.queryInterface("com.sun.star.graphic.XGraphicTransformer")
Basic ne rouspète pas mais je ne vois pas les méthodes de la nouvelle interface dans mon "nouvel" object (qui ne semble, en fait, ne pas avoir changé).

Je bidouille mais je ne comprends pas encore le mécanisme d'utilisation et d'accès aux "Xinterfaces". La documentation est très énigmatique avec des lapalissades qui ne permettent pas de savoir comment mettre en pratique ces notions.

Quelqu'un a-t-il des éléments pour m'aider à progresser ?

Cordialement
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office 6.3.5, 6.2.6, 5.3.7, 5.0.6.3,
MacOS X 10.11.6
Win 10
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Basic]Transparence image

Message par Hubert Lambert »

Bonjour,

Apparemment, il existe bien un service GraphicTransformer, mais qui n'est pas accessible via l'API.
Du coup, je ne vois pas d'autre solution que de bricoler un peu pour accéder aux éléments du dialogue "Remplacement de couleurs", en rendant ce dernier invisible pour limiter l'impression d'une "main invisible" contrôlant l'interface.
Le code :

Code : Tout sélectionner

dim continue

sub main
    doc = thiscomponent
    controleur = doc.CurrentController
    frame = controleur.Frame
    ' sélectionner la signature
    drawpage = doc.DrawPages(0)
    for n = 0 to drawpage.Count -1
        if drawpage(n).Name = "signature" then
            controleur.select(drawpage(n))
            exit for
        end if
    next n
    ' afficher le dialogue de remplacement de couleur    
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    dispatcher.executeDispatch(frame, ".uno:BmpMask", "", 0, array())
    ' obtenir le dialogue ouvert
    dlg_colorreplace = obtTopDialogueParID("DockingColorReplace")
    dlg_colorreplace.setVisible(False)
    ' cocher la première case à cocher
    roles = com.sun.star.accessibility.AccessibleRole
    cbx = obtObjetParRoleEtID(dlg_colorreplace, roles.CHECK_BOX, "cbx1")
    cbx.doAccessibleAction(0)
    ' adapter la tolérance
    tolerance = obtObjetParRoleEtID(dlg_colorreplace, roles.TEXT, "tol1")
    tolerance.setText("20")
    ' exécuter le remplacement
    dispatcher.executeDispatch(frame, ".uno:BmpMaskExec", "", 0, array())
     ' fermer le dialogue et désélectionner l'image
    dispatcher.executeDispatch(frame, ".uno:BmpMask", "", 0, array())
    controleur.select(rien)
end sub

function obtTopDialogueParID(ID)
    doc = thiscomponent
    tk = doc.CurrentController.ComponentWindow.Toolkit
    for n = 0 to tk.TopWindowCount -1
        topwindow = tk.getTopWindow(n)
        if topwindow.AccessibleContext.AccessibleID = ID then
            obtTopDialogueParID = topwindow
            exit function
        end if
    next n
end function

function obtObjetParRoleEtID(racine, role, ID)
    continue = True
    ac = racine.AccessibleContext
    if ac.AccessibleRole = role then
        if ac.AccessibleID = ID then
            obtObjetParRoleEtID = ac
            continue = False
        end if
    else
        for n = 0 to ac.AccessibleChildCount-1
            if continue = False then
                exit for
            end if
            ac1 = obtObjetParRoleEtID(ac.getAccessibleChild(n), role, ID)
            obtObjetParRoleEtID = ac1
        next n
    end if
end function
Et le fichier exemple :
mettreLeBlancEnTransparent_V2.odg
Valable pour LibreOffice uniquement.
Cordialement.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Basic]Transparence image

Message par luky-luke »

Bonjour
Hubert Lambert :bravo:
Hubert Lambert a écrit :Valable pour LibreOffice uniquement.
Valable que pour LibreOffice version 6.x.x
Sur la 5.3 et la 5.4 la propriété AccessibleID n’existe pas, il n'y a que la propriété AccessibleName qui permet d'avoir accès à la boite de dialogue via la fonction obtTopDialogueParID(ID) mais ça bute sur la fonction obtObjetParRoleEtID(racine, role, ID)
Super boulot en tout cas :super: , j'ai encore appris un truc ce soir 8)
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Gerfaud
NOOuvel adepte
NOOuvel adepte
Messages : 20
Inscription : 18 nov. 2012 08:42

Re: [Basic]Transparence image

Message par Gerfaud »

Bonjour,

Un immense merci.
L'accès aux dialogues de l'interface utilisateur m'ouvre en plus des perspectives insoupçonnées !
Je repars en exploration de ce que vous venez de me faire découvrir.

Cordialement
Libre Office 6.3.5, 6.2.6, 5.3.7, 5.0.6.3,
MacOS X 10.11.6
Win 10