Применение паттернов в canvas

87
25 марта 2021, 05:50

Я создаю фон, который почему-то перекрывает позже созданный мною паттерн. Не могу понять, как сделать наоборот.

const canvasPatterns = document.getElementById('fon'); 
    let ctx = canvasPatterns.getContext('2d'); 
 
    const img = new Image(); 
    img.src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/L_Old_London.svg/220px-L_Old_London.svg.png'; 
    img.onload = function () { 
        ctx.fillStyle = ctx.createPattern(img, 'repeat'); 
        ctx.fillRect(25, 25, ctx.canvas.width - 50, ctx.canvas.height - 50); 
    }; 
 
    const patternLine = document.getElementById('block'); 
    let patternCtx = patternLine.getContext('2d'); 
    patternCtx.fillStyle = 'grey'; 
    patternCtx.fillRect(0, 0, 25, 25); 
    patternLine.style.display = 'none'; 
 
    ctx.strokeStyle = ctx.createPattern(patternLine, 'repeat'); 
    ctx.lineWidth = 50; 
    ctx.strokeRect(0, 0, canvasPatterns.width, canvasPatterns.height); 
 
    ctx.fillStyle = ctx.createPattern(patternLine, 'repeat'); 
    ctx.lineWidth = 50; 
    ctx.strokeRect(25, 25, 100, 25);
<canvas id="fon" width="600" height="300"></canvas> 
<canvas id="block" width="25" height="25"></canvas>

Answer 1

img.onload = function ()

Выполнится только после того, как загрузится картинка, таким образом Вы сначала рисуете серый фон а затем уже то, что в Файле, решить проблему можно если рисовть абсолютно все после загрузки файла:

const canvasPatterns = document.getElementById('fon'); 
    let ctx = canvasPatterns.getContext('2d'); 
 
    const img = new Image(); 
    img.src = 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/L_Old_London.svg/220px-L_Old_London.svg.png'; 
    img.onload = function () { 
     
        ctx.fillStyle = ctx.createPattern(img, 'repeat'); 
        ctx.fillRect(25, 25, ctx.canvas.width - 50, ctx.canvas.height - 50); 
         
        const patternLine = document.getElementById('block'); 
        let patternCtx = patternLine.getContext('2d'); 
        patternCtx.fillStyle = 'grey'; 
        patternCtx.fillRect(0, 0, 25, 25); 
        patternLine.style.display = 'none'; 
 
        ctx.strokeStyle = ctx.createPattern(patternLine, 'repeat'); 
        ctx.lineWidth = 50; 
        ctx.strokeRect(0, 0, canvasPatterns.width, canvasPatterns.height); 
 
        ctx.fillStyle = ctx.createPattern(patternLine, 'repeat'); 
        ctx.lineWidth = 50; 
        ctx.strokeRect(25, 25, 100, 25); 
    };
<canvas id="fon" width="600" height="300"></canvas> 
<canvas id="block" width="25" height="25"></canvas>

READ ALSO
Почему не работает change в форме?

Почему не работает change в форме?

Вот часть формыНужно сохранять выбранные значения в localStorage

87
javascript получить GET параметр

javascript получить GET параметр

Нужно получить из урл значение get параметра "data", каким образом это можно реализовать?

97
Angular фильтрация, контроллеры

Angular фильтрация, контроллеры

Не могу разобраться с фильтрацией в angularА именно: Есть 2 контроллера, один отвечает за пользователей, другой за их местоположение

87
Google calendar api, актуальность данных

Google calendar api, актуальность данных

Всем приветРаботаю с google api, а конкретно с календарем

87