Генератор изображений с текстом на JavaScript

Генератор изображений с текстом на JavaScript

Здравствуйте! Сегодня мы рассмотрим с Вами пример программы на JavaScript, с помощью которой мы сможем создавать простые изображения с текстом.

Код:


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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Генератор картинок</title>
    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    <style>
        #canvasContainer {
            position: relative;
            width: 100%;
            height: 0;
            padding-bottom: 56.25%;
        }

        #canvas {
            position: absolute;
            width: 100%;
            height: 100%;
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <div class="container">
        <h3 class="h3 my-4">Генератор картинок</h3>
        <div class="row">
            <div class="col-md-6 mt-4">
                <div id="canvasContainer">
                    <canvas id="canvas"></canvas>
                </div>
            </div>
            <div class="col-md-6">

                <label for="bgColor">Цвет фона:</label>
                <input type="color" id="bgColor" class="form-control mb-2">
                <label for="text">Текст:</label>
                <input type="text" id="textInput" value="Привет, мир!" class="form-control mb-2">
                <label for="textColor">Цвет текста:</label>
                <input type="color" id="textColor" class="form-control mb-2">
                <label for="fontSize">Размер шрифта:</label>
                <input type="number" id="fontSize" min="1" value="20" class="form-control mb-2">
                <label for="textX">Позиция текста по X:</label>
                <input type="range" id="textX" min="0" max="400" value="200" class="form-control mb-2">
                <label for="textY">Позиция текста по Y:</label>
                <input type="range" id="textY" min="0" max="200" value="100" class="form-control mb-2">
                <button id="generateImageButton" class="btn btn-primary">Сгенерировать изображение</button>
            </div>
        </div>
    </div>

    <!-- Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
        crossorigin="anonymous"></script>

    <script>

        const el = (selector) => document.querySelector(selector);

        document.addEventListener('DOMContentLoaded', function () {

            const generateButton = el('#generateImageButton');
            const bgColor = el('#bgColor');
            const text = el('#textInput');
            const textColor = el('#textColor');
            const fontSize = el('#fontSize');
            const textX = el('#textX');
            const textY = el('#textY');
            const maxWidth = canvas.width - textX;

            generateButton.addEventListener('click', generateImage);
            textX.addEventListener('change', onTextPositionChange);
            textY.addEventListener('change', onTextPositionChange);
            fontSize.addEventListener('change', onTextPositionChange);

            function onTextPositionChange(e) {
                generateImage();
            }

            // функция, которая рисует 
            function generateImage() {

                const canvas = el('#canvas');
                const ctx = canvas.getContext('2d');

                // Очищаем холст
                ctx.clearRect(0, 0, canvas.width, canvas.height);

                // Устанавливаем фоновый цвет
                ctx.fillStyle = bgColor.value;
                ctx.fillRect(0, 0, canvas.width, canvas.height);

                // Устанавливаем цвет текста и размер шрифта
                ctx.font = parseInt(fontSize.value) / 2 + 'px Arial';
                ctx.fillStyle = textColor.value;

                const words = text.value.split(' ');
                let line = '';
                const lines = [];

                for (let i = 0; i < words.length; i++) {
                    const testLine = line + words[i] + ' ';
                    const metrics = ctx.measureText(testLine);
                    const testWidth = metrics.width;
                    if (testWidth > maxWidth && i > 0) {
                        lines.push(line);
                        line = words[i] + ' ';
                    } else {
                        line = testLine;
                    }
                }
                lines.push(line);

                // Рисуем текст на холсте
                const lineHeight = parseInt(fontSize.value) + 5;
                for (let j = 0; j < lines.length; j++) {
                    ctx.fillText(lines[j], parseInt(textX.value), parseInt(textY.value) + (j * lineHeight));
                }
            }
        });

    </script>
</body>

</html>


Источник

Shopping Cart