Créer des cadres pour les images ou les aligner ou faire les deux et plus en même temps

Bonjour, nous cherchons comment faire pour soit:
-Créer des cadres ne contenant chacun qu’une seule image et ainsi quand nous collons par exemple 40 images, les images se répartissent dans les cadres (qui sont bien sûr alignés).

soit:
-Aligner une colonne d’images

soit;
-Un programme qui réduit les images à la bonne taille, ouvre autant de page qu’il le faut (à raison de neuf images par page) et les place sur ces pages en les alignant.

Merci d’avance pour vos réponses.

Insert an image at cursor position - The Document Foundation Wiki

un exemple concret ?

Des images de 8.8cm de hauteur et 6.3cm de largeur.
Le programme était une bonne idée,merci, mais nous tombons toujours sur erreur de lecture, et cela n’insère des images qu’une par une.

ça serait utile d’être un peu plus précis, sinon le jeu des devinettes risque d’être long :confused:

certes.
là encore aucun idée d’où sont vos images,
donc le principe général → Instruction For...Next

C’est bon, c’est juste nous qui avions copié le mauvais chemin d’accès, désolé.

Les images sont dans un dossier.
Donc en soit, il suffirait de donner le chemin d’accès au dossier, d’en récupérer les images et les placer en ajoutant dans les paramètres de position l’espace voulu entre elles. Le problème étant que nous ne savons pas comment régler les paramètres de positions, la plupart des programmes utilisent la position du curseur.
Un programme un peu comme ça (mais qui fonctionnerait avec les commandes Basic des macros).

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

Sub insert_image_in_current_position()

a=0
b=0
path_dossier = "/home/..."
doc = ThisComponent

For Each image.webp in dossier
    image = doc.createInstance("com.sun.star.text.GraphicObject")
	image.GraphicURL = ConvertToURL(path_image) #faut_il garder cela?#
	image.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
	pos(X)=a
	pos(Y)=b
	pos = (doc.pos(X);doc.pos(Y))
	image.Width = 6300
	image.Height = 8800
	pos(Y)+8800+2500=b
Next        
pos.Text.insertTextContent(pos, image, False) #il n'y a pas de texte, que des images# 
End Sub

pour continuer dans l’optique TextContentAnchorType.AS_CHARACTER,
il suffit d’ajouter des sauts de paragraphe pour empiler les images :
https://wiki.documentfoundation.org/Documentation/BASIC_Guide#Inserting_Control_Codes #Inserting_Control_Codes

oText.insertControlCharacter(oCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)

Retraits et espacement

pour élargir les perspectives de solution, puisque le sujet est aussi taggé “draw”,
on peut remplacer le principe .AnchorType par un positionnement direct :

    Dim oPos
    oPos = oGraph.position
    oPos.x = 5000
    oPos.y = 3000
    oGraph.position = oPos

il faut alors gérer la création des pages dans Draw :
https://wiki.documentfoundation.org/Documentation/BASIC_Guide#Creating_and_Deleting_Pages #Creating_and_Deleting_Pages

question vocabulaire-> Algorithme — Wikipédia

pourquoi ?
on prend tout ce qui il y a dans le répertoire?

quitte à programmer, autant généraliser un peu, donc avec Draw, ça donne :

Const nCols = 3
Const nRows = 3
Const nPerPage = nCols*nRows

Const Height = 8800
Const Width = 6300

' ________________________
Sub pickFolder
  oFolderPicker = CreateUnoService( "com.sun.star.ui.dialogs.FolderPicker" )
  oFolderPicker.setTitle("Pick directory with images (Ask 122435)")
' oFolderPicker.setDisplayDirectory( "/tmp/" )
  If oFolderPicker.execute() = 1 Then insertImagesFromFolder(oFolderPicker.getDirectory())
End sub


Sub insertImagesFromFolder(sFolder as String)

  x = Array(1000,7500,14000)
  y = Array(1000,10400,19800)

  Globalscope.BasicLibraries.LoadLibrary("Tools")
  aList = ReadDirectories(sFolder, True, False, False) 

  For i = LBound(aList) To UBound(aList)
   InsertImage(int(i/nPerPage), x(i mod nCols), y(int(i/nCols) mod nRows), aList(i,0))
  next i
End sub

Sub InsertImage(p as Integer, x as Integer, y as Integer, sURL as String)

    oGraph = thisComponent.createInstance("com.sun.star.drawing.GraphicObjectShape")
    oGraph.Graphic = getgraphfromurlaslink(sURL)
    oGraph.GraphicURL = sURL

    If p >= thisComponent.DrawPages.count then 
       thisComponent.DrawPages.insertNewByIndex(p)
    End if 
    thisComponent.DrawPages(p).add(oGraph)

	oSize = oGraph.Size
    oSize.Height = Height
    oSize.Width = Width
    oGraph.setsize(oSize)

    oPos = oGraph.position
    oPos.x = x
    oPos.y = y
    oGraph.position = oPos
End sub

function getGraphFromUrlAsLink(sFileUrl as String ) as Object 
  oProvider = createUnoService("com.sun.star.graphic.GraphicProvider") 
  Dim oPropsIN(1)as new com.sun.star.beans.PropertyValue 
  oPropsIN(0).Name  = "URL" 
  oPropsIN(0).Value = converttoURL(sFileUrl)
  oPropsIN(1).Name  = "LoadAsLink" 
  oPropsIN(1).Value = TRUE
  getGraphFromUrlAsLink = oProvider.queryGraphic(oPropsIN()) 
end function

insertImagesFromFolder_Ask122435.odg (10.2 KB)

faut-il préciser :

et exemple 2x2 :
image

Cela fonctionne parfaitement, merci beaucoup.

dernier point utile à considérer :

en utilisant com.sun.star.graphic.GraphicProvider, on peut ajouter des références génériques aux images externes comme 1.png, 2.png, …
relatives au fichier .odt.

Merci de toute votre aide, à travers les pages vers lequelles vous nous renvoyez.
Mais bien que celles-ci peuvent être très intéressantes, et vos conseils aussi, nous nous voyons dans l’incapacité d’en utiliser les ressources car nous ne savons pas coder en basic…
En revanche nous pouvons vous dire très précisement comment nous pensons le protocole du programme qui permettrait de résoudre notre problème.

-Demander le nombre d’images
-Ouvrir autant de pages sans marges que le nombre d’image divisé par 9 (arrondis à l’entier supérieur)
-Ouvrir les images qui sont toutes dans un dossier
-Les ancrer au caractère avec dans les paramètres de position Horizontal: De gauche ; Vertical: Du haut
-Les réduire à 8.8cm de hauteur et 6.3cm de largeur
-Assigner une page à chaque groupe de neuf images
-Pour chaque groupe:
-mettre la première image en position (1.00;1.00)
-mettre la deuxième image en position (1.00;10.40)
-mettre la troisième image en position (1.00;19.80)
-mettre la quatrième image en position (7.50;1.00)
-mettre la cinquième image en position (7.50;10.40)
-mettre la sixième image en position (7.50;19.80)
-mettre la septième image en position (14.00;1.00)
-mettre la huitième image en position (14.00;10.40)
-mettre la neuvième image en position (14.00;19.80)
Fin
Nous pensons que les deux dernières instructions peuvent être inversées ou groupées et la quatrième instruction peut être optionnelle si ce sont les paramètres par défaut.

et dans un autre language ?

pour référence, dans un sujet qui part finalement dans tous les sens :innocent:
https://stackoverflow.com/questions/63394471/trying-to-make-3-x-3-montage-of-9-images-using-imagemagick-but-getting-error-for