Як використовувати Canvas JavaScript, щоб додати спеціальну рамку до замаскованого зображення

Як використовувати Canvas JavaScript, щоб додати спеціальну рамку до замаскованого зображення
Як використовувати Canvas JavaScript, щоб додати спеціальну рамку до замаскованого зображення

Освоєння замаскованих меж зображень у JavaScript Canvas

Злиття кількох зображень є звичайним кроком у створенні візуальних ефектів JavaScript. Визначення видимих ​​областей зображення за допомогою маски є частим прийомом. Хоча це корисно для створення унікальних форм, може бути складно додати рамку навколо цих замаскованих форм. Хоча полотно елемент у JavaScript пропонує широкий спектр маніпуляцій із зображеннями, нелегко налаштувати рамку навколо зображення, яке було замасковане.

Розробники можуть творчо застосовувати маски та вирізати зображення за допомогою Canvas API, хоча за замовчуванням будь-яка створена межа має тенденцію відповідати прямокутній формі полотна. Коли ви хочете створити рамку, яка збігається з краями складної форми, визначеної маскою, це створює проблему. Мета полягає в тому, щоб простежити точну подорож маски за прямою прямокутною межею.

У цьому дописі пояснюється, як застосувати маску зображення в JavaScript і, що більш важливо, як переконатися, що чітка форма маскованого зображення оточена рамкою. Крім того, ми розглянемо функцію, яка завершує маскування, але ще не має визначеного межового рішення.

Ви можете налаштувати зовнішній вигляд межі, навчившись працювати з комбінованими операціями на полотні. Давайте почнемо і подивимося, як використовувати функції полотна JavaScript, щоб додати необхідну рамку навколо замаскованого зображення.

Команда Приклад використання
globalCompositeOperation Цією ознакою визначається композиція малюнкових дій на полотні. GlobalCompositeOperation ='source-in' у прикладі гарантує, що зображення маски вирізає основне зображення так, що видно лише ті області, які перетинаються.
toDataURL() Перетворює інформацію полотна в зображення, закодоване за допомогою Base64. Це дає змогу використовувати готове зображення як PNG після застосування маски та рамки. Виведення зображення у прикладі створюється за допомогою canvas.toDataURL('image/png').
crossOrigin Ця функція зважає на обмеження безпеки, дозволяючи використовувати на полотні зображення, завантажені з іншого домену. MaskImg.crossOrigin = 'anonymous' гарантує, що доступ до зображення маски може бути здійснений без проблем CORS.
beginPath() За допомогою цього методу на полотні можна створити новий контур. Другий метод викликає ctx.beginPath(), щоб переконатися, що шлях дотримується контуру маски, коли він малює спеціальну рамку навколо замаскованого зображення.
moveTo() При цій процедурі креслення не робляться; замість цього «перо» переміщується на нове місце початку. Початкову точку межі встановлюють у прикладі за допомогою ctx.moveTo(0, 0), що важливо для точного малювання межі навколо меж маски.
lineTo() Використовуючи задані координати як початкову точку, ця техніка малює пряму лінію. Межа замаскованого зображення визначається лініями, намальованими в розчині за допомогою ctx.lineTo(maskImg.width, 0).
stroke() Уздовж визначеного шляху малює межі або лінії. Наприклад, moveTo() і lineTo() використовуються для визначення форми маски, а потім ctx.stroke() використовується для застосування рамки навколо замаскованого зображення.
lineWidth Визначає, наскільки товстими будуть лінії нанесені на полотно. Сценарій встановлює рамку товщиною 5 пікселів навколо форми маски за допомогою ctx.lineWidth = 5.
strokeStyle Вказує колір або стиль рамки. Колір рамки у прикладі встановлено на червоний за допомогою ctx.strokeStyle ='red'.

Розпізнавання того, як застосувати рамку до замаскованого зображення

Мета наданих сценаріїв полягає в тому, щоб використовувати інше зображення як маску для одного зображення, а потім використовувати Canvas API щоб додати спеціальну рамку навколо замаскованої форми. Два нових об’єкти зображення створюються на початку функції для маски та основного зображення. Під час завантаження фотографій із зовнішніх джерел налаштування перехресного походження є важливим, щоб запобігти проблемам через CORS. Після завантаження обох зображень формується полотно, а його пропорції регулюються відповідно до зображення маски. Це дозволяє уникнути проблем зі зміною розміру під час малювання зображення та гарантує, що полотно буде підготовлено до роботи з відповідною областю.

Потім сценарій використовує drawImage() функція для малювання зображення маски на полотні. При цьому маска наноситься на полотно, яке є базовим шаром для процедури маскування. Щоб правильно застосувати маску, для глобальної комбінованої операції має бути встановлено значення "джерело вхід". Полотно отримує інструкцію зберігати лише ті області основного зображення, які збігаються із зображенням маски. По суті, маска визначає форму, до якої обрізається основне зображення. Комбінована операція скидається на «джерело над», коли основне зображення малюється всередині цієї області відсікання, що дозволяє виконувати додаткові дії, як-от малювання рамки, не впливаючи на попередньо відрізаний вміст.

Застосування рамки до замаскованої форми передбачає використання інсульт() техніка. Зазначений шлях або форма на полотні вказується цією командою. У другому рішенні, moveTo() і lineTo() поєднуються, щоб вручну створити контур полотна та простежити межі маски. За допомогою цих прийомів ви можете вручну вказати форму рамки та переконатися, що вона дотримується форми маски, а не прямокутної межі полотна. Ви маєте повний контроль над зовнішнім виглядом кордону, оскільки lineWidth властивість встановлює товщину межі та strokeStyle властивість встановлює свій колір.

Нарешті, функція toDataURL() використовується для перетворення полотна в рядок Base64. Завдяки цьому готове зображення, включаючи маску та рамку, перетворюється у формат, який легко використовувати в інших областях програми або завантажувати на сервер. Щоб уникнути помилок часу, обіцянка гарантує, що ця операція завершується лише тоді, коли обидва зображення повністю завантажуються. Ці сценарії демонструють, як складні методи модифікації зображення, включаючи маскування та застосування динамічної рамки, яка точно відповідає контурам маски, можуть бути виконані за допомогою елемента canvas JavaScript.

Спосіб 1. Використання методу «Полотно» та «Обведення» для додавання настроюваної рамки до замаскованого зображення

Щоб побудувати рамку навколо замаскованого зображення, цей підхід використовує JavaScript і Canvas API. Stroke() використовується для окреслення замаскованої форми.

function applyFiltersAndConvertToBase64(imageUrl, materialImage) {
    return new Promise((resolve, reject) => {
        const maskImg = new Image();
        const mainImg = new Image();
        maskImg.crossOrigin = "anonymous";
        mainImg.crossOrigin = "anonymous";
        let imagesLoaded = 0;
        const onLoad = () => {
            imagesLoaded++;
            if (imagesLoaded === 2) {
                const canvas = document.createElement('canvas');
                const ctx = canvas.getContext('2d');
                canvas.width = maskImg.width;
                canvas.height = maskImg.height;
                ctx.drawImage(maskImg, 0, 0);
                ctx.globalCompositeOperation = 'source-in';
                ctx.drawImage(mainImg, 0, 0, maskImg.width, maskImg.height);
                ctx.globalCompositeOperation = 'source-over';
                ctx.lineWidth = 5; // Border thickness
                ctx.strokeStyle = 'red'; // Border color
                ctx.stroke(); // Draw border around mask
                const base64Image = canvas.toDataURL('image/png');
                resolve(base64Image);
            }
        };
        maskImg.onload = onLoad;
        mainImg.onload = onLoad;
        maskImg.onerror = reject;
        mainImg.onerror = reject;
        maskImg.src = imageUrl;
        mainImg.src = materialImage;
    });
}

Варіант 2. Створіть спеціальну рамку навколо фігури маски за допомогою шляху полотна

Цей метод гарантує, що межа точно повторює замасковану форму, дотримуючись шляху маски зображення за допомогою API Canvas із JavaScript.

function applyFiltersAndConvertToBase64(imageUrl, materialImage) {
    return new Promise((resolve, reject) => {
        const maskImg = new Image();
        const mainImg = new Image();
        maskImg.crossOrigin = "anonymous";
        mainImg.crossOrigin = "anonymous";
        let imagesLoaded = 0;
        const onLoad = () => {
            imagesLoaded++;
            if (imagesLoaded === 2) {
                const canvas = document.createElement('canvas');
                const ctx = canvas.getContext('2d');
                canvas.width = maskImg.width;
                canvas.height = maskImg.height;
                ctx.drawImage(maskImg, 0, 0);
                ctx.globalCompositeOperation = 'source-in';
                ctx.drawImage(mainImg, 0, 0, maskImg.width, maskImg.height);
                ctx.globalCompositeOperation = 'source-over';
                // Create path for the mask shape
                ctx.beginPath();
                ctx.moveTo(0, 0);
                ctx.lineTo(maskImg.width, 0);
                ctx.lineTo(maskImg.width, maskImg.height);
                ctx.lineTo(0, maskImg.height);
                ctx.closePath();
                ctx.lineWidth = 5; // Border thickness
                ctx.strokeStyle = 'blue'; // Border color
                ctx.stroke(); // Apply the border along the path
                const base64Image = canvas.toDataURL('image/png');
                resolve(base64Image);
            }
        };
        maskImg.onload = onLoad;
        mainImg.onload = onLoad;
        maskImg.onerror = reject;
        mainImg.onerror = reject;
        maskImg.src = imageUrl;
        mainImg.src = materialImage;
    });
}

Покращення замаскованих зображень за допомогою спеціальних рамок у JavaScript

Можливість маскувати зображення та встановлювати власні межі під час роботи з Canvas API. За допомогою маскування ви можете визначити, які області зображення будуть видимі залежно від іншого зображення, відомого як маска. Додавання рамки навколо маскованої зони є проблемою, з якою стикаються багато розробників, особливо коли маска не має простої прямокутної форми. Проекти з межами, які точно збігаються з контуром маски, виглядатимуть більш витонченими та експертними.

Корисним рішенням цієї проблеми є використання Canvas API Шлях 2D об'єкт. Ви можете використовувати Path2D для розробки складних маршрутів, які відповідають контурам вашої маски, а потім оточують їх рамкою. Цей метод дозволяє генерувати межі, які точно відповідають кутам вашої спеціальної маски, виходячи за межі звичайних прямокутників. Використання moveTo() і lineTo() разом легше простежити контури маски та гарантує точне вирівнювання межі.

Продуктивність — ще один важливий фактор, який слід брати до уваги, особливо під час роботи з великими зображеннями або динамічного застосування рамок у режимі реального часу. Швидкість вашої програми можна покращити, використовуючи такі стратегії, як кешування замаскованого зображення, скорочення операцій малювання та спрощення процесу візуалізації полотна. Навіть у складних або високопродуктивних налаштуваннях ви можете гарантувати, що процедури маскування та малювання меж відбуватимуться гладко, зменшуючи безглузді дії.

Поширені запитання щодо маскування та обрамлення зображень за допомогою Canvas

  1. Як у JavaScript використовувати інше зображення для маскування іншого?
  2. Використання 2 встановити на 'source-in', намалюйте маску на полотні, щоб замаскувати зображення за допомогою Canvas API. Щоб відповідати масці, основне зображення буде обрізано.
  3. Як я можу створити рамку для замаскованого зображення, яка відповідає його формі?
  4. Після встановлення маршруту маски с moveTo() і lineTo(), використовуйте stroke() техніка. Це дозволить вам обвести форму маски індивідуальною рамкою.
  5. Яка мета toDataURL() в маніпуляції полотном?
  6. Вміст полотна перетворюється на зображення, закодоване Base64, за допомогою toDataURL() функція, яка полегшує використання або розповсюдження як зображення PNG.
  7. Як я можу оптимізувати операції полотна для продуктивності?
  8. Зменшіть кількість операцій малювання та подумайте про збереження часто використовуваних елементів, щоб максимізувати швидкість полотна. Це забезпечує безперебійну роботу вашої програми та зменшує кількість перемальовувань.
  9. Чи можу я завантажити на полотно зображення різного походження?
  10. Так, але щоб зробити зображення доступним, не викликаючи труднощів із CORS, вам потрібно встановити crossOrigin властивість до 'anonymous'.

Останні думки про маскування та межі

У програмах JavaScript маскування зображень і застосування власних меж на полотні є ефективним способом створення відшліфованих візуальних елементів. Розробники мають можливість маніпулювати рендерингом і стилем зображень, використовуючи Canvas API і складні команди малювання, такі як інсульт() і визначення шляху.

Плавна робота забезпечується ретельною оптимізацією рамок і операцій маскування, особливо для великих фотографій. Цей підручник містить корисний метод динамічного малювання меж навколо непрямокутних зображень, що корисно під час розробки онлайн-програм, які є естетично привабливими та адаптивними.

Посилання на техніку маскування та рамки на полотні
  1. Детальна інструкція з використання Canvas API маніпулювати зображеннями та масками, включаючи такі операції малювання, як 4 і 2: Веб-документи MDN .
  2. Вичерпне пояснення того, як застосувати маскування зображень і обробку перехресних ресурсів у JavaScript: Підручники з HTML5 Canvas .
  3. Поради щодо продуктивності для програм на основі полотна, зосереджених на оптимізації візуалізації зображень і операцій малювання: Журнал Smashing .