Date: prev next · Thread: first prev next last
2016 Archives by date, by thread · List index


Bonsoir, Le calcul des dimensions d'une sélection d'objets fonctionne, mais j'ai dû passer le type int en long parce que j'avais des images qui dépassaient les limites.

J'ai repris ma macro d'exportation d'image et Je l'ai généralisée pour les formats png et jpeg, soit en pleine page, soit sur la sélection, sur une base de densité de pixels en DPI, mais en laissant la possibilité de faire un tableau de dimensions en pixels si l'on souhaite.

Les images sont exportées avec le nom du fichier, le numéro, le nom de la page, une extension qui dépend si c'est la petite ou la grande image, dans le répertoire du fichier, avec deux images (une grande et une petite) pour chaque page. Si vous voulez une seule taille par page, mettez la même définition et la même extension pour les deux tailles d'images.

J'ai fait des essais d'exportation en bmp, mais Je ne contrôle pas correctement les dimensions des grandes images qui plafonnent.

Est-ce que quelqu'un saurait comment sélectionner/déselectionner une couche en basic ?

Voici donc la mise à jour:

REM  *****  BASIC  *****

'Exportation automatique de pages Libre office draw vers un format image bitmap, une image par page

sub ExportFullPng  'exporte la pleine page
    ExportImg ("png", false, 220, 100, ".p", ".s")
end sub

sub ExportFullJpg
    ExportImg ("jpg", false, 220, 100, ".p", ".s")
end sub

sub ExportSelPng 'exporte uniquement les graphismes de la page (sélection automatique)
    ExportImg ("png", true, 220, 100, ".p", ".s")
end sub

sub ExportSelJpg
    ExportImg ("jpg", true, 220, 100, ".p", ".s")
end sub

sub ExportSelBmp 'exporte, mais la définition n'est pas claire, seul le paramètre de la petite image semble avoir un effet
    ExportImg ("bmp", true, 220, 50, ".p", ".s")
end sub

Sub ExportImg (format, selection, dpiLarge, dpiSmall, aEXtp, aEXts) 'Exporte la selection complete de chaque page en fonction de dpi

'aEXtp = 'extension de la grande image
'aEXts = 'extension de la petite image

REM Filter dependent filter properties
Dim aFilterData (10) As New com.sun.star.beans.PropertyValue
Dim sFileUrl As String
Dim oDoc, fDoc, dispatcher AS Object
Dim oDrawPage As Object
Dim curFile, aFile, aPage as String
'aEXtp, aEXts
Dim defdpi as Integer
Dim selWidth,selHeight as Long
Dim cfRed, hratio as double
Dim gsize (2)
'Nomme les pages, pour remplacer le numéro de page - ce qui suit est un exemple pageName = array ("sens","pose","tapees","accouplees","battement","volets_pliants","montages_speciaux","types_courants","autres_types","symboles","symboles2","details","loqueteau","tableau","entrees_d_air")

'Vous pouvez imposer les dimensions d'image au lieu des densités de pixels en remplissant ces tableaux -> les dpi images seront erronés 'arrWidthp = array (1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,800)
'arrWidths = array (640,576,512,512,576,512,512,576,576,512,512,640,220)

oDoc = ThisComponent
curFile = ThisComponent.getURL()
curFile = Left(curFile, Len(curFile)-4) 'Supprime l'extension de fichier (.odg)

For i = 0 to oDoc.getDrawPages().Count-1  'Balaye toutes les pages
    oDrawPage = oDoc.getDrawPages().getByIndex(i)
    oDoc.CurrentController.setCurrentPage(oDrawPage)
    if (selection) then
        fDoc   = oDoc.CurrentController.Frame
        dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(fDoc, ".uno:SelectAll", "", 0, Array()) 'sélectionne tous les éléments
    end if
    xView = oDoc.currentController
    xObj = xView.currentPage
    xSelection = xView.selection
    If not(selection) or isEmpty(xSelection) then
        xObj = xView.currentPage
        selWidth = oDrawPage.Width 'Largeur de la page
        selHeight = oDrawPage.Height 'Largeur de la page
    else
        xObj = xSelection
gsize = calcSize(xObj) 'Calcule la largeur des éléments sélectionnés
        selWidth = gsize(0)
        selHeight = gsize(1)
    End If
    hratio = selHeight/selWidth
    aPage = "_p"+ (i+1)    'nom de la page par défaut

    ' PARAMETRES D'EXPORTATION
    aFilterData(0).Name = "PixelWidth"
    aFilterData(0).Value = Int(selWidth*(dpiLarge/2540))
    on error Resume Next
        aPage = "_"+pageName(i) 'nomme la page si eelle est dans un tableau
aFilterData(0).Value = arrWidthp(i) 'définit la largeur si elle est dans un tableau
    on error Goto 0
    aFilterData(1).Name = "PixelHeight"
    aFilterData(1).Value = Int(hratio*aFilterData(0).Value)
    ' compression - png
    aFilterData(2).Name ="Compression"
    aFilterData(2).Value = 9 'de 0 à 9
    ' entrelacement - png
    aFilterData(3).Name ="Interlaced"
    aFilterData(3).Value = 0
    ' transparence (png - doit être faux, sinon problème de lisibilité)
    aFilterData(4).Name = "Translucent"
    'Paramètres pour exportation jpeg
    aFilterData(4).Value = false
    aFilterData(7).Name = "Resolution"
aFilterData(7).Value = dpiLarge 'Requis pour fichier bmp, mais le fonctionnement n'est pas clair
    aFilterData(8).Name ="LogicalWidth"
       aFilterData(8).Value = aFilterData(0).Value*2540/dpiLarge
    aFilterData(9).Name ="LogicalHeight"
      aFilterData(9).Value = aFilterData(1).Value*2540/dpiLarge
    aFilterData(10).Name ="Quality"
    aFilterData(10).Value = 85

    oDoc.CurrentController.setCurrentPage(oDrawPage)
    sFileUrl =  curFile + aPage + aExtp    + "." + format
    Export (xObj, sFileUrl, aFilterData(), format) 'Exporter grande image
    Wait 500
    aFilterData(0).Value = Int(selWidth*(dpiSmall/2540))
    on error Resume Next
        aFilterData(0).Value = arrWidths(i)
    on error Goto 0
    aFilterData(1).Value = Int(hratio*aFilterData(0).Value)
    if format="bmp" then
        aFilterData(8).Value = Int(aFilterData(8).Value*dpiSmall/dpiLarge)
        aFilterData(9).Value = Int(aFilterData(9).Value*dpiSmall/dpiLarge)
    end if
     sFileUrl =  curFile + aPage + aExts    + "." + format
    Export (xObj, sFileUrl, aFilterData(), format) 'Exporter petite image
    Wait 500
Next i
oDrawPage = oDoc.getDrawPages().getByIndex(0)
oDoc.CurrentController.setCurrentPage(oDrawPage)

End Sub

Sub Export (xObject, sFileUrl As String, aFilterData, format)
Dim xExporter, mediaExt
xExporter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
xExporter.SetSourceDocument(xObject)
Dim aArgs (2) As New com.sun.star.beans.PropertyValue
Dim aURL As New com.sun.star.util.URL
aURL.complete = sFileUrl
if format="jpg" then
    mediaExt = "jpeg" ' "image/jpg" ne fonctionne pas correctement
else
    mediaExt = format
end if
aArgs(0).Name = "MediaType"
aArgs(0).Value = "image/"+mediaExt
aArgs(1).Name = "URL"
aArgs(1).Value = aURL
aArgs(2).Name = "FilterData"
aArgs(2).Value = aFilterData
xExporter.filter(aArgs())
End Sub

function calcSize (oObj) 'oObj est une selection d'objets graphiques dont on calcule les dimensions
Dim x0, y0, x1, y1 As Long 'La hauteur peut dépasser 32000-> entier long
    x0=oObj(0).Position.X
    y0=oObj(0).Position.Y
    x1=x0+oObj(0).Size.Width
    y1=y0+oObj(0).Size.Height
    For i=1 To (oObj.Count-1)
        If (oObj(i).Position.X<x0) Then x0=oObj(i).Position.X
        If (oObj(i).Position.Y<y0) Then y0=oObj(i).Position.Y
If ((oObj(i).Position.X+oObj(i).Size.Width)>x1) then x1=oObj(i).Position.X+oObj(i).Size.Width If ((oObj(i).Position.Y+oObj(i).Size.Height)>y1) then y1=oObj(i).Position.Y+oObj(i).Size.Height
    Next i
    calcSize = array(x1-x0, y1-y0)
end function

Salutations, Pierre

Le 05/12/2016 à 13:44, Agnès Simonet a écrit :
Merci pour cette version considérablement enrichie.
Pour les autres formats, la difficulté c'est d'obtenir des infos sur les paramètres d'export. En regardant la fenêtre qui s'affiche quand on fait Fichier>Exporter pour un format donné on arrive à imaginer ce qui est possible. Reste à trouver la syntaxe.
Pour la différence entre "PixelWidth" et "LogicalWidth" j'ai trouvé ça :
"Each graphic filter is supporting a property sequence which is called "FilterData" therein you can set the size in pixel with the properties "PixelWidth" and "PixelHeight", the logical size (in 1/100mm) can be set with "LogicalWidth" and "LogicalHeight"."

Pour avoir la taille de la sélection on peut faire ceci :

'****************
'calcul des dimensions en mm*100
'où oObj = oDoc.currentController.selection 'collection de toutes les formes sélectionnées

    Dim x0, y0, x1, y1 As Integer
    Dim ObjetLargeur, ObjetHauteur As Integer

    x0=oObj(0).Position.X
    y0=oObj(0).Position.Y
    x1=x0+oObj(0).Size.Width
    y1=y0+oObj(0).Size.Height
    For i=1 To (oObj.Count-1)
        If (oObj(i).Position.X<x0) Then x0=oObj(i).Position.X
        If (oObj(i).Position.Y<y0) Then y0=oObj(i).Position.Y
If ((oObj(i).Position.X+oObj(i).Size.Width)>x1) then x1=oObj(i).Position.X+oObj(i).Size.Width If ((oObj(i).Position.Y+oObj(i).Size.Height)>y1) then y1=oObj(i).Position.Y+oObj(i).Size.Height
    Next i

    ObjetLargeur=x1-x0
    ObjetHauteur=y1-y0
'****************

Cordialement
Agnès S.

Le 04/12/2016 17:07, Pierre ROUZEAU a écrit :
Merci, c'est ce que je recherchais, mais le premier message n'est pas
arrivé dans ma boite mail.

J'ai modifié les macros pour :

- Exporter chaque page (dans le répertoire courant, avec le nom du
fichier source+le numéro de page)

- Exporter deux images a des définitions différentes pour chaque page

- Avoir en option un nom à la place du numéro de page, stocké dans un
tableau

Le nombre de pixels n'est pris en compte que s'il est entier, les
valeurs décimales ne marchent pas.

J'ai fait deux variantes

- Export2png qui exporte la totalité de chaque page avec une densité de
pixel définie (en dpi)

- ExportSelPng qui n'exporte que ce qui est visible (sélectionner tout),
avec une largeur d'image fixée en pixels

Pour la deuxième variante, on peut en option saisir des tableaux
définissant la largeur de chaque image. Si le tableau n'est pas rempli,
la largeur par défaut est utilisée.

J'ai essayé de faire une variante d'exportation en jpg, dans ce cas il
faut utiliser les variables LogicalHeight et LogicalWidth avec un
coefficient, mais pour une raison inconnue, Je ne peut pas avoir
d'images de plus de 497 pixels de large.

Salutations, Pierre

REM  *****  BASIC  *****

Sub Export2png 'Exporte la pleine page sur une densité de pixels
REM Filter dependent filter properties
Dim aFilterData (4) As New com.sun.star.beans.PropertyValue
Dim sFileUrl As String
Dim oDoc AS Object
Dim oDrawPage As Object
Dim curFile, aFile, aPage as string
Dim defdpi as integer
Dim cfRed as double
Dim wd, ht as long
'Ce qui suit est un exemple pour nomme les pages (au lieu de p1, p2, etc.)
pageName = array ("Nom_Page_1","Nom_Page_2")

defdpi= 160 ' densité de pixel en dpi export pour la grande image (.p.png)
cfRed = 0.32 'Coefficient de réduction pour l'image réduite (.s.png)

oDoc = thisComponent
curFile = ThisComponent.getURL()
curFile = Left(curFile, Len(curFile)-4) 'Supprime l'extension de fichier
(.odg)

For i = 0 to oDoc.getDrawPages().Count-1  'Balaye toutes les pages
     oDrawPage = oDoc.getDrawPages().getByIndex(i)
     oDoc.CurrentController.setCurrentPage(oDrawPage)
     xObj = oDoc.currentController.currentPage
     ' PARAMETRES D'EXPORTATION
     aFilterData(0).Name = "PixelWidth"
     aFilterData(0).Value = Int(oDrawPage.Width*(defdpi/2540))
     aFilterData(1).Name = "PixelHeight"
     aFilterData(1).Value = Int(oDrawPage.Height*(defdpi/2540))
     ' compression
     aFilterData(2).Name ="Compression"
     aFilterData(2).Value = 9 'de 0 à 9
     ' entrelacement
     aFilterData(3).Name ="Interlaced"
     aFilterData(3).Value = 0
     ' transparence
     aFilterData(4).Name = "Translucent"
     aFilterData(4).Value = false

     aPage = "_p"+ (i+1)
     on error Resume Next
            aPage = "_"+pageName(i)
            aFilterData(0).Value = arrWidthp(i)
     on error Goto 0
     sFileUrl =  curFile + aPage + ".p.png"
     ExportPng( xObj, sFileUrl, aFilterData() )
     Wait 500
     aFilterData(0).Value =     Int(aFilterData(0).Value * cfRed)
     aFilterData(1).Value =     Int(aFilterData(1).Value * cfRed)
     on error Resume Next
            aFilterData(0).Value = arrWidths(i)
     on error Goto 0
     sFileUrl =  curFile + aPage + ".s.png"
     ExportPng( xObj, sFileUrl, aFilterData() )
     Wait 500
Next i

End Sub


Sub ExportSelPng 'Exporte la selection complete de chaque page sur une
largeur fixée
REM Filter dependent filter properties
Dim aFilterData (8) As New com.sun.star.beans.PropertyValue
Dim sFileUrl As String
Dim oDoc, fDoc, dispatcher AS Object
Dim oDrawPage As Object
Dim curFile, aFile, aPage as string
Dim defdpi, par as integer
Dim cfRed as double
Dim wd, ht as long
'Nomme les pages, pour remplacer le numéro de page - ce qui suit est un
exemple
pageName = array
("sens","pose","tapees","accouplees","battement","volets_pliants","montages_speciaux","types_courants","autres_types","symboles","symboles2","details","loqueteau")

'largeurs par défaut
widthp = 1536 ' Largeur par défaut de la grande image - la hauteur
s'ajuste automatiquement
widths = 576  ' Largeur par défaut de la petite image
'Tableaux des largeurs si non constantes
arrWidths = array
(1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,1536,800)
arrWidths = array (640,576,512,512,576,512,512,576,576,512,512,640,172)

oDoc = ThisComponent
curFile = ThisComponent.getURL()
curFile = Left(curFile, Len(curFile)-4) 'Supprime l'extension de fichier
(.odg)

For i = 0 to oDoc.getDrawPages().Count-1  'Balaye toutes les pages
     oDrawPage = oDoc.getDrawPages().getByIndex(i)
     oDoc.CurrentController.setCurrentPage(oDrawPage)
     ' PARAMETRES D'EXPORTATION
     aFilterData(0).Name = "PixelWidth"
     aFilterData(0).Value = widthp
     'aFilterData(1).Name = "PixelHeight"
     'aFilterData(1).Value =
     ' compression
     aFilterData(2).Name ="Compression"
     aFilterData(2).Value = 9 'de 0 à 9
     ' entrelacement
     aFilterData(3).Name ="Interlaced"
     aFilterData(3).Value = 0
     ' transparence
     aFilterData(4).Name = "Translucent"
     aFilterData(4).Value = false

     aFilterData(6).Name = "ExportMode"
     aFilterData(6).Value = 0

     fDoc   = oDoc.CurrentController.Frame
     dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
     dispatcher.executeDispatch(fDoc, ".uno:SelectAll", "", 0, Array())

     xObj = oDoc.currentController.currentPage
     xView = oDoc.currentController
     'Select all components of this page

     xSelection = xView.selection 'pour pouvoir exporter une sélection
correctement, il faudrait connaitre ses dimensions
     If isEmpty( xSelection ) Then
         xObj = xView.currentPage
     Else
         xObj = xSelection
     End If
     aPage = "_p"+ (i+1)
     on error Resume Next
            aPage = "_"+pageName(i)
            aFilterData(0).Value = arrWidthp(i)
     on error Goto 0
     oDoc.CurrentController.setCurrentPage(oDrawPage)
     sFileUrl =  curFile + aPage + ".p.png"
     ExportPng (xObj, sFileUrl, aFilterData())
     Wait 500
     aFilterData(0).Value =     widths
     on error Resume Next
        aFilterData(0).Value = arrWidths(i)
     on error Goto 0
     sFileUrl =  curFile + aPage + ".s.png"
     ExportPng (xObj, sFileUrl, aFilterData())
     Wait 500
Next i

End Sub


Sub ExportPng( xObject, sFileUrl As String, aFilterData )
Dim xExporter
xExporter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" )
xExporter.SetSourceDocument(xObject)
Dim aArgs (2) As New com.sun.star.beans.PropertyValue
Dim aURL As New com.sun.star.util.URL
aURL.complete = sFileUrl
aArgs(0).Name = "MediaType"
aArgs(0).Value = "image/png"
aArgs(1).Name = "URL"
aArgs(1).Value = aURL
aArgs(2).Name = "FilterData"
aArgs(2).Value = aFilterData
xExporter.filter( aArgs() )
End Sub


Le 01/12/2016 à 09:28, Agnès Simonet a écrit :
Bonjour,

Le 30/11/2016 21:37, Pierre ROUZEAU a écrit :

Il n'y a pas d'espoir du coté des macros ? Sans enregistreur, comment
connaitre la syntaxe ?


Si, mais il faut lire les réponses à la question posée ;-)
http://listarchives.libreoffice.org/fr/users/msg28946.html

Cordialement
Agnès S.




---
L'absence de virus dans ce courrier électronique a été vérifiée par le
logiciel antivirus Avast.
https://www.avast.com/antivirus



--

---------------------------------------------------------------------------
Pierre Rouzeau - Proud indigenous of old Europe
www.rouzeau.net <http://www.rouzeau.net>
---------------------------------------------------------------------------



---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus

--
Envoyez un mail à users+unsubscribe@fr.libreoffice.org pour savoir comment vous désinscrire
Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être 
supprimés

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.