{"id":941,"date":"2026-07-25T17:09:56","date_gmt":"2026-07-25T15:09:56","guid":{"rendered":"https:\/\/www.gimp-libreoffice.fr\/?page_id=941"},"modified":"2026-07-25T17:09:56","modified_gmt":"2026-07-25T15:09:56","slug":"generateur-de-formules-pour-custom-layout-pour-montage-de-gmic","status":"publish","type":"page","link":"https:\/\/www.gimp-libreoffice.fr\/index.php\/generateur-de-formules-pour-custom-layout-pour-montage-de-gmic\/","title":{"rendered":"G\u00e9n\u00e9rateur de Formules pour Custom Layout pour Montage de G&rsquo;MIC"},"content":{"rendered":"\n<style data-wp-block-html=\"css\">\n<style>\n  .gmic-tool-wrapper {\n    --gmic-primary: #2b5c8f;\n    --gmic-bg: #f4f6f9;\n    --gmic-card-bg: #ffffff;\n    --gmic-border: #dcdfe6;\n    --gmic-text: #333333;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n    color: var(--gmic-text);\n    margin: 20px 0;\n  }\n\n  .gmic-tool-wrapper .container {\n    max-width: 900px;\n    margin: 0 auto;\n    background: var(--gmic-card-bg);\n    padding: 25px;\n    border-radius: 8px;\n    box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n  }\n\n  .gmic-tool-wrapper h1 {\n    color: var(--gmic-primary);\n    margin-top: 0;\n    font-size: 1.5rem;\n  }\n\n  .gmic-tool-wrapper .form-group {\n    margin-bottom: 20px;\n  }\n\n  .gmic-tool-wrapper label {\n    font-weight: bold;\n    display: block;\n    margin-bottom: 8px;\n  }\n\n  .gmic-tool-wrapper input[type=\"number\"] {\n    width: 80px;\n    padding: 8px;\n    font-size: 1rem;\n    border: 1px solid var(--gmic-border);\n    border-radius: 4px;\n  }\n\n  .gmic-tool-wrapper .presets-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n    gap: 15px;\n    margin-top: 15px;\n  }\n\n  .gmic-tool-wrapper .preset-card {\n    border: 1px solid var(--gmic-border);\n    border-radius: 6px;\n    padding: 12px;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    background: #fafafa;\n  }\n\n  .gmic-tool-wrapper .preset-card:hover {\n    border-color: var(--gmic-primary);\n    background: #f0f5fa;\n  }\n\n  .gmic-tool-wrapper .preset-card.active {\n    border-color: var(--gmic-primary);\n    background: #eef4fc;\n    box-shadow: 0 0 0 2px rgba(43, 92, 143, 0.2);\n  }\n\n  .gmic-tool-wrapper .preset-title {\n    font-weight: bold;\n    font-size: 0.9rem;\n    margin-bottom: 5px;\n    color: var(--gmic-primary);\n  }\n\n  .gmic-tool-wrapper .code-box {\n    background: #272822;\n    color: #a6e22e;\n    font-family: monospace;\n    padding: 6px 10px;\n    border-radius: 4px;\n    font-size: 0.85rem;\n    word-break: break-all;\n  }\n\n  .gmic-tool-wrapper .output-section {\n    margin-top: 30px;\n    padding: 15px;\n    background: #eef4fc;\n    border-left: 4px solid var(--gmic-primary);\n    border-radius: 0 6px 6px 0;\n  }\n\n  .gmic-tool-wrapper .result-code {\n    font-family: monospace;\n    font-size: 1.2rem;\n    background: #ffffff;\n    padding: 10px;\n    border: 1px solid var(--gmic-border);\n    border-radius: 4px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .gmic-tool-wrapper .btn-copy {\n    background: var(--gmic-primary);\n    color: #fff;\n    border: none;\n    padding: 8px 15px;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 0.9rem;\n    white-space: nowrap;\n  }\n\n  .gmic-tool-wrapper .btn-copy:hover {\n    opacity: 0.9;\n  }\n\n  .gmic-tool-wrapper .alert-warning {\n    display: none;\n    background-color: #fff3cd;\n    color: #856404;\n    border: 1px solid #ffeeba;\n    padding: 12px 15px;\n    border-radius: 6px;\n    margin-top: 15px;\n    font-size: 0.9rem;\n    line-height: 1.4;\n  }\n\n  .gmic-tool-wrapper .alert-warning strong {\n    color: #533f03;\n  }\n<\/style>\n<\/style>\n\n<script data-wp-block-html=\"js\">\n<!-- 3. SCRIPT JAVASCRIPT -->\n<script>\n(function() {\n  function initGmicTool() {\n    const templates = {\n      2: [\n        { name: \"C\u00f4te \u00e0 c\u00f4te (Horizontal)\", formula: \"H(0,1)\" },\n        { name: \"L'une sur l'autre (Vertical)\", formula: \"V(0,1)\" }\n      ],\n      3: [\n        { name: \"1 grande \u00e0 gauche, 2 empil\u00e9es \u00e0 droite\", formula: \"H(0,V(1,2))\" },\n        { name: \"2 empil\u00e9es \u00e0 gauche, 1 grande \u00e0 droite\", formula: \"H(V(0,1),2)\" },\n        { name: \"1 grande en haut, 2 c\u00f4te \u00e0 c\u00f4te en bas\", formula: \"V(0,H(1,2))\" },\n        { name: \"2 c\u00f4te \u00e0 c\u00f4te en haut, 1 grande en bas\", formula: \"V(H(0,1),2)\" },\n        { name: \"3 en ligne horizontale\", formula: \"H(0,H(1,2))\" },\n        { name: \"3 en colonne verticale\", formula: \"V(0,V(1,2))\" }\n      ],\n      4: [\n        { name: \"Grille 2x2 classique\", formula: \"V(H(0,1),H(2,3))\" },\n        { name: \"1 grande \u00e0 gauche, 3 empil\u00e9es \u00e0 droite\", formula: \"H(0,V(1,V(2,3)))\" },\n        { name: \"1 grande en haut, 3 align\u00e9es en bas\", formula: \"V(0,H(1,H(2,3)))\" },\n        { name: \"1 grande \u00e0 gauche, droite (1 en haut + 2 en bas)\", formula: \"H(0,V(1,H(2,3)))\" }\n      ],\n      5: [\n        { name: \"Composition mixte (2 en haut \/ 3 en bas)\", formula: \"V(H(0,1),H(2,H(3,4)))\" },\n        { name: \"1 grande \u00e0 gauche, 4 en grille \u00e0 droite\", formula: \"H(0,V(H(1,2),H(3,4)))\" }\n      ]\n    };\n\n    const imgInput = document.getElementById('imgCount');\n    const presetsContainer = document.getElementById('presetsList');\n    const outputFormula = document.getElementById('outputFormula');\n    const warningBox = document.getElementById('warningBox');\n    const btnCopy = document.getElementById('btnCopy');\n\n    if (!imgInput || !presetsContainer || !outputFormula) return;\n\n    function generateLinear(type, n) {\n      if (n === 1) return \"0\";\n      let res = `${n-1}`;\n      for (let i = n - 2; i >= 0; i--) {\n        res = `${type}(${i},${res})`;\n      }\n      return res;\n    }\n\n    function generateGrid(n) {\n      let items = Array.from({length: n}, (_, i) => i);\n      function buildRecursive(arr) {\n        if (arr.length === 1) return arr[0];\n        const mid = Math.ceil(arr.length \/ 2);\n        const left = buildRecursive(arr.slice(0, mid));\n        const right = buildRecursive(arr.slice(mid));\n        return `H(${left},${right})`;\n      }\n      const half = Math.ceil(n \/ 2);\n      return `V(${buildRecursive(items.slice(0, half))},${buildRecursive(items.slice(half))})`;\n    }\n\n    function selectFormula(formula) {\n      outputFormula.innerText = formula;\n    }\n\n    function renderPresets() {\n      const count = parseInt(imgInput.value) || 2;\n      presetsContainer.innerHTML = '';\n\n      if (warningBox) {\n        warningBox.style.display = count > 6 ? 'block' : 'none';\n      }\n\n      const list = templates[count] || [\n        { name: \"Grille \u00e9quilibr\u00e9e automatique\", formula: generateGrid(count) },\n        { name: \"Alignement Horizontal complet\", formula: generateLinear('H', count) },\n        { name: \"Alignement Vertical complet\", formula: generateLinear('V', count) }\n      ];\n\n      list.forEach((item, index) => {\n        const card = document.createElement('div');\n        card.className = 'preset-card';\n        card.onclick = () => {\n          document.querySelectorAll('.gmic-tool-wrapper .preset-card').forEach(c => c.classList.remove('active'));\n          card.classList.add('active');\n          selectFormula(item.formula);\n        };\n\n        card.innerHTML = `\n          <div class=\"preset-title\">${item.name}<\/div>\n          <div class=\"code-box\">${item.formula}<\/div>\n        `;\n        presetsContainer.appendChild(card);\n        \n        if (index === 0) {\n          card.classList.add('active');\n          selectFormula(item.formula);\n        }\n      });\n    }\n\n    if (btnCopy) {\n      btnCopy.addEventListener('click', function() {\n        navigator.clipboard.writeText(outputFormula.innerText);\n        const originalText = btnCopy.innerText;\n        btnCopy.innerText = 'Copi\u00e9 !';\n        setTimeout(() => btnCopy.innerText = originalText, 1500);\n      });\n    }\n\n    imgInput.addEventListener('input', renderPresets);\n    renderPresets();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initGmicTool);\n  } else {\n    initGmicTool();\n  }\n})();\n<\/script>\n<\/script>\n\n<!-- 1. STRUCTURE HTML -->\n<div class=\"gmic-tool-wrapper\">\n  <div class=\"container\">\n    <h1>G\u00e9n\u00e9rateur de Formules G&rsquo;MIC (Custom Layout)<\/h1>\n    \n    <div class=\"form-group\">\n      <label for=\"imgCount\">Nombre d&rsquo;images dans GIMP :<\/label>\n      <input type=\"number\" id=\"imgCount\" min=\"2\" max=\"12\" value=\"3\">\n      \n      <div id=\"warningBox\" class=\"alert-warning\">\n        \u26a0\ufe0f <strong>Attention aux performances :<\/strong> Assembler plus de 6 photos haute r\u00e9solution n\u00e9cessite une configuration muscl\u00e9e (notamment en m\u00e9moire RAM). Si votre syst\u00e8me manque de ressources, GIMP risque de ralentir ou de se figer lors de la pr\u00e9visualisation G&rsquo;MIC.\n      <\/div>\n    <\/div>\n\n    <div class=\"form-group\">\n      <label>Choisissez une disposition sugg\u00e9r\u00e9e :<\/label>\n      <div id=\"presetsList\" class=\"presets-grid\"><\/div>\n    <\/div>\n\n    <div class=\"output-section\">\n      <label>Formule g\u00e9n\u00e9r\u00e9e pour G&rsquo;MIC :<\/label>\n      <div class=\"result-code\">\n        <span id=\"outputFormula\">H(0,V(1,2))<\/span>\n        <button class=\"btn-copy\" id=\"btnCopy\" type=\"button\">Copier<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- 2. STYLES CSS ISOLES -->\n<style>\n  .gmic-tool-wrapper {\n    --gmic-primary: #2b5c8f;\n    --gmic-bg: #f4f6f9;\n    --gmic-card-bg: #ffffff;\n    --gmic-border: #dcdfe6;\n    --gmic-text: #333333;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n    color: var(--gmic-text);\n    margin: 20px 0;\n  }\n\n  .gmic-tool-wrapper .container {\n    max-width: 900px;\n    margin: 0 auto;\n    background: var(--gmic-card-bg);\n    padding: 25px;\n    border-radius: 8px;\n    box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n  }\n\n  .gmic-tool-wrapper h1 {\n    color: var(--gmic-primary);\n    margin-top: 0;\n    font-size: 1.5rem;\n  }\n\n  .gmic-tool-wrapper .form-group {\n    margin-bottom: 20px;\n  }\n\n  .gmic-tool-wrapper label {\n    font-weight: bold;\n    display: block;\n    margin-bottom: 8px;\n  }\n\n  .gmic-tool-wrapper input[type=\"number\"] {\n    width: 80px;\n    padding: 8px;\n    font-size: 1rem;\n    border: 1px solid var(--gmic-border);\n    border-radius: 4px;\n  }\n\n  .gmic-tool-wrapper .presets-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n    gap: 15px;\n    margin-top: 15px;\n  }\n\n  .gmic-tool-wrapper .preset-card {\n    border: 1px solid var(--gmic-border);\n    border-radius: 6px;\n    padding: 12px;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    background: #fafafa;\n  }\n\n  .gmic-tool-wrapper .preset-card:hover {\n    border-color: var(--gmic-primary);\n    background: #f0f5fa;\n  }\n\n  .gmic-tool-wrapper .preset-card.active {\n    border-color: var(--gmic-primary);\n    background: #eef4fc;\n    box-shadow: 0 0 0 2px rgba(43, 92, 143, 0.2);\n  }\n\n  .gmic-tool-wrapper .preset-title {\n    font-weight: bold;\n    font-size: 0.9rem;\n    margin-bottom: 5px;\n    color: var(--gmic-primary);\n  }\n\n  .gmic-tool-wrapper .code-box {\n    background: #272822;\n    color: #a6e22e;\n    font-family: monospace;\n    padding: 6px 10px;\n    border-radius: 4px;\n    font-size: 0.85rem;\n    word-break: break-all;\n  }\n\n  .gmic-tool-wrapper .output-section {\n    margin-top: 30px;\n    padding: 15px;\n    background: #eef4fc;\n    border-left: 4px solid var(--gmic-primary);\n    border-radius: 0 6px 6px 0;\n  }\n\n  .gmic-tool-wrapper .result-code {\n    font-family: monospace;\n    font-size: 1.2rem;\n    background: #ffffff;\n    padding: 10px;\n    border: 1px solid var(--gmic-border);\n    border-radius: 4px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .gmic-tool-wrapper .btn-copy {\n    background: var(--gmic-primary);\n    color: #fff;\n    border: none;\n    padding: 8px 15px;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 0.9rem;\n    white-space: nowrap;\n  }\n\n  .gmic-tool-wrapper .btn-copy:hover {\n    opacity: 0.9;\n  }\n\n  .gmic-tool-wrapper .alert-warning {\n    display: none;\n    background-color: #fff3cd;\n    color: #856404;\n    border: 1px solid #ffeeba;\n    padding: 12px 15px;\n    border-radius: 6px;\n    margin-top: 15px;\n    font-size: 0.9rem;\n    line-height: 1.4;\n  }\n\n  .gmic-tool-wrapper .alert-warning strong {\n    color: #533f03;\n  }\n<\/style>\n\n<!-- 3. SCRIPT JAVASCRIPT -->\n<script>\n(function() {\n  function initGmicTool() {\n    const templates = {\n      2: [\n        { name: \"C\u00f4te \u00e0 c\u00f4te (Horizontal)\", formula: \"H(0,1)\" },\n        { name: \"L'une sur l'autre (Vertical)\", formula: \"V(0,1)\" }\n      ],\n      3: [\n        { name: \"1 grande \u00e0 gauche, 2 empil\u00e9es \u00e0 droite\", formula: \"H(0,V(1,2))\" },\n        { name: \"2 empil\u00e9es \u00e0 gauche, 1 grande \u00e0 droite\", formula: \"H(V(0,1),2)\" },\n        { name: \"1 grande en haut, 2 c\u00f4te \u00e0 c\u00f4te en bas\", formula: \"V(0,H(1,2))\" },\n        { name: \"2 c\u00f4te \u00e0 c\u00f4te en haut, 1 grande en bas\", formula: \"V(H(0,1),2)\" },\n        { name: \"3 en ligne horizontale\", formula: \"H(0,H(1,2))\" },\n        { name: \"3 en colonne verticale\", formula: \"V(0,V(1,2))\" }\n      ],\n      4: [\n        { name: \"Grille 2x2 classique\", formula: \"V(H(0,1),H(2,3))\" },\n        { name: \"1 grande \u00e0 gauche, 3 empil\u00e9es \u00e0 droite\", formula: \"H(0,V(1,V(2,3)))\" },\n        { name: \"1 grande en haut, 3 align\u00e9es en bas\", formula: \"V(0,H(1,H(2,3)))\" },\n        { name: \"1 grande \u00e0 gauche, droite (1 en haut + 2 en bas)\", formula: \"H(0,V(1,H(2,3)))\" }\n      ],\n      5: [\n        { name: \"Composition mixte (2 en haut \/ 3 en bas)\", formula: \"V(H(0,1),H(2,H(3,4)))\" },\n        { name: \"1 grande \u00e0 gauche, 4 en grille \u00e0 droite\", formula: \"H(0,V(H(1,2),H(3,4)))\" }\n      ]\n    };\n\n    const imgInput = document.getElementById('imgCount');\n    const presetsContainer = document.getElementById('presetsList');\n    const outputFormula = document.getElementById('outputFormula');\n    const warningBox = document.getElementById('warningBox');\n    const btnCopy = document.getElementById('btnCopy');\n\n    if (!imgInput || !presetsContainer || !outputFormula) return;\n\n    function generateLinear(type, n) {\n      if (n === 1) return \"0\";\n      let res = `${n-1}`;\n      for (let i = n - 2; i >= 0; i--) {\n        res = `${type}(${i},${res})`;\n      }\n      return res;\n    }\n\n    function generateGrid(n) {\n      let items = Array.from({length: n}, (_, i) => i);\n      function buildRecursive(arr) {\n        if (arr.length === 1) return arr[0];\n        const mid = Math.ceil(arr.length \/ 2);\n        const left = buildRecursive(arr.slice(0, mid));\n        const right = buildRecursive(arr.slice(mid));\n        return `H(${left},${right})`;\n      }\n      const half = Math.ceil(n \/ 2);\n      return `V(${buildRecursive(items.slice(0, half))},${buildRecursive(items.slice(half))})`;\n    }\n\n    function selectFormula(formula) {\n      outputFormula.innerText = formula;\n    }\n\n    function renderPresets() {\n      const count = parseInt(imgInput.value) || 2;\n      presetsContainer.innerHTML = '';\n\n      if (warningBox) {\n        warningBox.style.display = count > 6 ? 'block' : 'none';\n      }\n\n      const list = templates[count] || [\n        { name: \"Grille \u00e9quilibr\u00e9e automatique\", formula: generateGrid(count) },\n        { name: \"Alignement Horizontal complet\", formula: generateLinear('H', count) },\n        { name: \"Alignement Vertical complet\", formula: generateLinear('V', count) }\n      ];\n\n      list.forEach((item, index) => {\n        const card = document.createElement('div');\n        card.className = 'preset-card';\n        card.onclick = () => {\n          document.querySelectorAll('.gmic-tool-wrapper .preset-card').forEach(c => c.classList.remove('active'));\n          card.classList.add('active');\n          selectFormula(item.formula);\n        };\n\n        card.innerHTML = `\n          <div class=\"preset-title\">${item.name}<\/div>\n          <div class=\"code-box\">${item.formula}<\/div>\n        `;\n        presetsContainer.appendChild(card);\n        \n        if (index === 0) {\n          card.classList.add('active');\n          selectFormula(item.formula);\n        }\n      });\n    }\n\n    if (btnCopy) {\n      btnCopy.addEventListener('click', function() {\n        navigator.clipboard.writeText(outputFormula.innerText);\n        const originalText = btnCopy.innerText;\n        btnCopy.innerText = 'Copi\u00e9 !';\n        setTimeout(() => btnCopy.innerText = originalText, 1500);\n      });\n    }\n\n    imgInput.addEventListener('input', renderPresets);\n    renderPresets();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initGmicTool);\n  } else {\n    initGmicTool();\n  }\n})();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"slide-text-bg2\">\n<h3>G\u00e9n\u00e9rateur de Formules G&rsquo;MIC (Custom Layout) Nombre d&rsquo;images dans GIMP : \u26a0\ufe0f Attention aux performances : Assembler plus de 6<\/h3>\n<\/div>\n<div class=\"flex-btn-div\"><a href=\"https:\/\/www.gimp-libreoffice.fr\/index.php\/generateur-de-formules-pour-custom-layout-pour-montage-de-gmic\/\" class=\"btn1 flex-btn\">Lire la suite<\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-941","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/pages\/941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/comments?post=941"}],"version-history":[{"count":5,"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/pages\/941\/revisions"}],"predecessor-version":[{"id":947,"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/pages\/941\/revisions\/947"}],"wp:attachment":[{"href":"https:\/\/www.gimp-libreoffice.fr\/index.php\/wp-json\/wp\/v2\/media?parent=941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}