upload/1630508547-83523-plaque.jpg Bonjour,
j'ai tenté d'adapter un code pour mon site. Il s'agit d'afficher sur une image un texte modifiable à volonté (taille, position, font...)
ça fonctionne avec Firefox et Edge, mais l'image n’apparaît pas avec IE
Et surtout, dans tous les cas, mon bouton "Sauvegarder" ne fonctionne pas. Je ne comprends pas pourquoi et me prends le chou depuis des heuuuures...
Voici le code :

<!DOCTYPE html>
<html lang="en" >

<head>
<meta charset="UTF-8">

<titre>Générateur de texte</titre>

<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="main.css" rel="stylesheet">
</head>
  
  <style>


    .row {
      width: 100%;
      padding: 5px;
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      justify-content: center;
    }
	
    .column {
      padding: 0px 10px;
      display: flex;
      flex-direction: column;
      justify-content: center;
    }
	
    .input-container {
      padding-bottom: 3px;
    }
	
    .titre {
      font-size: 20px;
    }
	
    #text {
      width: 200px;
      height: 100px;
    }
	
    #download-link {
      display: none;
    }
    #save-button {
      font-size: 20px;
      cursor: pointer;
      color: black;
      background-color: white;
    }
	
    #save-button:hover {
      color: white;
      background-color: black;
    }
	
    #canvas {
      max-width: 100%;
      height: auto;
    }
	
	column
    @media(max-width: 400px)
	{.column 
	{text-align: center;
     width: 100%;
     padding-bottom: 10px;
      }}
	  
</style>

<body>

<div class="row">
<div class="titre">
Générateur de Texte
</div>
</div>
  
<div class="row">
<div class="column">
<div>
Texte à insérer
</div>
	  
<div>	  
<textarea id="text">
Votre texte 
ou chiffres 

ICI
</textarea>
</div>
</div>

<div class="column">
<div>
Taille du texte
</div>

<div class="input-container">
<input id="font-size" placeholder="eg: 50" value="50">
</div>

      <div>
        Espace entre les lignes
      </div>
      <div class="input-container">
        <input id="gap-size" placeholder="eg: 0" value="0">
      </div>
      <div>
        Distance depuis le haut
      </div>
      <div class="input-container">
        <input id="buffer-size" placeholder="e.g.: 200" value="140"/>
      </div>
    </div>
    <div class="column">
      <div>
        Style d'écriture
      </div>
      <div class="input-container">
        <select id="font-style">
		  <option value="Times New Roman">Times New Roman</option>
          <option value="Times">Times</option>
          <option value="Arial">Arial</option>
          <option value="Helvetica">Helvetica</option>
          <option value="Courier New">Courier New</option>
          <option value="Courier">Courier</option>
          <option value="Verdana">Verdana</option>
          <option value="Georgia">Georgia</option>
          <option value="Palatino">Palatino</option>
          <option value="Garamond">Garamond</option>
          <option value="Bookman">Bookman</option>
          <option value="Comic Sans MS">Comic Sans MS</option>
          <option value="Trebuchet MS">Trebuchet MS</option>
          <option value="Arial Black">Arial Black</option>
          <option value="Impact">Impact</option>
        </select>
      </div>
      <div>
        Contour
        <input id="font-is-outline" type="checkbox"/>
      </div>
      <div>
        Gras
        <input id="font-is-bold" type="checkbox"/>
      </div>
    </div>
    <div class="column">
      <div>
        <button id="save-button">Sauvegarder</button>
      </div>
    </div>
  </div>
  <div class="row">
    <canvas id="canvas"></canvas>
  </div>
  <a id="download-link" download="plaque.png"></a>

  <script>

    const elmTextArea = document.getElementById("text");
    const elmCanvas = document.getElementById("canvas");
    const ctx = elmCanvas.getContext("2d");
    const img = new Image();

    function paint() {
      elmCanvas.width = img.width;
      elmCanvas.height = img.height;
      ctx.drawImage(img, 0, 0);

      const center = elmCanvas.width / 2;
      const color = '#000000';
      const fontSize = parseInt(document.getElementById("font-size").value);
      const bufferSize = parseInt(document.getElementById("buffer-size").value);
      const gapSize = parseInt(document.getElementById("gap-size").value);
      const fontStyle = document.getElementById("font-style").value;
      const fontIsOutline = document.getElementById("font-is-outline").checked;
      const fontWeight = document.getElementById("font-is-bold").checked ? 'bold' : 'normal';

      ctx.textAlign = "center";
      ctx.font = `${fontWeight} ${fontSize}px ${fontStyle}`;
      ctx.lineWidth = 1;
      ctx.fillStyle = color;
      ctx.strokeStyle = color;

      elmTextArea.value.split('\n').forEach((line, i) => {
        const yOffset = bufferSize + (i * (gapSize + fontSize));
        if (fontIsOutline){
          ctx.strokeText(line, center, yOffset);
        } else {
          ctx.fillText(line, center, yOffset);
        }
      });
    }

    img.onload = paint;
    img.src = 'plaque.jpg';

    document.addEventListener('input', e => {
      if (e.target.matches('input,textarea')) {
        e.stopPropagation();
        paint();
      }
    });
    document.addEventListener('change', e => {
      if (e.target.matches('select,input[type=checkbox]')) {
        e.stopPropagation();
        paint();
      }
    });

    document.getElementById('save-button').addEventListener('click', () => {
      var dt = elmCanvas.toDataURL("image/png");
      const elmDownload = document.getElementById("download-link");
      elmDownload.href = dt;
      elmDownload.click();
    });

  </script>
</body>
</html>


Voilà voilà...
Merci à celui ou celle qui voudra bien me donner un petit coup de main.
Pasterize
Modifié par pasterize (01 Sep 2021 - 17:02)
Résolu, il fallait éditer l'image du canvas pour en obtenir une url et l'entrer dans img.src="https://......."
Merci à moi-même... Smiley lol