Kako koristiti JavaScript Canvas za dodavanje prilagođenog obruba maskiranoj slici

Kako koristiti JavaScript Canvas za dodavanje prilagođenog obruba maskiranoj slici
Kako koristiti JavaScript Canvas za dodavanje prilagođenog obruba maskiranoj slici

Savladavanje obruba maskiranih slika u JavaScript platnu

Fuzija više slika uobičajen je korak u stvaranju JavaScript vizualnih efekata. Definiranje vidljivih područja slike pomoću maske česta je tehnika. Iako je ovo korisno za stvaranje jedinstvenih oblika, može biti izazovno dodati obrub oko tih maskiranih oblika. Iako je platno element u JavaScriptu nudi opsežnu manipulaciju slikom, nije lako prilagoditi obrub oko slike koja je maskirana.

Programeri mogu primijeniti maske i isjecati slike na maštovite načine pomoću Canvas API, iako prema zadanim postavkama svaki generirani obrub nastoji odgovarati pravokutnom obliku platna. Kada želite stvoriti obrub koji odgovara rubovima kompliciranog oblika koji je definiran maskom, to predstavlja problem. Cilj je pratiti precizno putovanje maske izvan jednostavne pravokutne granice.

Ovaj će post objasniti kako primijeniti masku slike u JavaScriptu i, što je još bitnije, kako osigurati da je poseban oblik maskirane slike okružen rubom. Dodatno, proći ćemo kroz funkciju koja dovršava maskiranje, ali još nema definirano rješenje obruba.

Možete fino podesiti izgled obruba tako što ćete naučiti kako raditi s kompozitnim operacijama na platnu. Započnimo i pogledajmo kako koristiti značajke platna JavaScripta za dodavanje potrebne granice oko maskirane slike.

Naredba Primjer korištenja
globalCompositeOperation Kompozicija radnji crtanja na platnu definirana je ovom značajkom. GlobalCompositeOperation ='source-in' u primjeru osigurava da slika maske isječe glavnu sliku tako da se vide samo područja koja se sijeku.
toDataURL() Pretvara informacije o platnu u sliku kodiranu s Base64. To omogućuje korištenje gotove slike kao PNG nakon primjene maske i obruba. Izlaz slike primjera proizvodi se pomoću canvas.toDataURL('image/png').
crossOrigin Ova značajka poštuje sigurnosna ograničenja tako što omogućuje korištenje slika učitanih s druge domene na platnu. MaskImg.crossOrigin = 'anonymous' jamči da se pristup slici maske može napraviti bez izazivanja problema s CORS-om.
beginPath() Na platnu se ovom metodom može započeti nova staza. Druga metoda poziva ctx.beginPath() kako bi osigurala da putanja prianja uz konturu maske dok iscrtava prilagođeni obrub oko maskirane slike.
moveTo() Ovim se postupkom ne izrađuju crteži; umjesto toga, "olovka" se pomiče na novo početno mjesto. Početna točka obruba postavljena je u primjeru pomoću ctx.moveTo(0, 0), što je bitno za točno crtanje obruba oko granica maske.
lineTo() Koristeći zadane koordinate kao početnu točku, ova tehnika crta ravnu liniju. Rub maskirane slike definiran je linijama nacrtanim u rješenju pomoću ctx.lineTo(maskImg.width, 0).
stroke() Duž označene putanje crta obrube ili linije. Na primjer, moveTo() i lineTo() koriste se za definiranje forme maske, a zatim se ctx.stroke() koristi za primjenu obruba oko maskirane slike.
lineWidth Određuje koliko su debele linije naslikane na platnu. Skripta uspostavlja obrub debljine 5 piksela oko oblika maske pomoću ctx.lineWidth = 5.
strokeStyle Označava boju ili stil obruba. Boja ruba u primjeru postavljena je na crvenu pomoću ctx.strokeStyle ='red'.

Prepoznavanje kako primijeniti obrub na maskiranu sliku

Cilj isporučenih skripti je koristiti drugu sliku kao masku za jednu sliku, a zatim koristiti Canvas API za dodavanje prilagođenog obruba oko maskiranog oblika. Dva nova slikovna objekta stvaraju se na početku funkcije za masku i glavnu sliku. Prilikom učitavanja fotografija iz vanjskih izvora, postavka unakrsnog porijekla bitna je za sprječavanje problema uzrokovanih CORS-om. Oblikuje se platno i njegovi se proporci prilagođavaju da odgovaraju slici maske nakon što su obje slike učitane. Time se izbjegavaju problemi s promjenom veličine tijekom crtanja slike i jamči da je platno pripremljeno za rad s odgovarajućim područjem.

Skripta zatim koristi drawImage() funkciju za crtanje slike maske na platnu. Pritom se maska ​​nanosi na platno koje služi kao temeljni sloj za postupak maskiranja. Globalna kompozitna operacija mora biti postavljena na "source-in" kako bi se maska ​​ispravno primijenila. Platnu se daje uputa da zadrži samo područja primarne slike koja se podudaraju sa slikom maske. U biti, maska ​​definira oblik na koji je glavna slika izrezana. Kompozitna operacija se vraća na "source-over" kada se glavna slika iscrta unutar ovog područja izrezivanja, omogućujući dodatne radnje kao što je slikanje obruba bez utjecaja na prethodno izrezani sadržaj.

Primjena obruba na maskirani oblik uključuje korištenje moždani udar () tehnika. Navedeni put ili obrazac na platnu označen je ovom naredbom. U drugom rješenju, moveTo() i lineTo() kombiniraju se za ručno generiranje putanje platna i praćenje obruba maske. Pomoću ovih tehnika možete ručno odrediti oblik obruba i osigurati da prianja uz oblik maske, a ne pravokutnu granicu platna. Imate potpunu kontrolu nad izgledom granice jer širina linije Svojstvo postavlja debljinu obruba i strokeStyle svojstvo postavlja svoju boju.

Na kraju, funkcija toDataURL() koristi se za transformaciju platna u niz Base64. Radeći to, gotova slika—maska ​​i obrub uključeni—transformira se u format koji se lako koristi u drugim područjima programa ili učitava na poslužitelj. Kako bi se izbjegle pogreške u mjerenju vremena, obećanje osigurava da ova operacija završi tek kada se obje slike potpuno učitaju. Ove skripte pokazuju kako se sofisticirane tehnike modificiranja slike, uključujući maskiranje i primjenu dinamičkog obruba koji točno odgovara obrisima maske, mogu postići s elementom platna JavaScripta.

Metoda 1: Korištenje metode platna i poteza za dodavanje prilagođenog obruba maskiranoj slici

Kako bi se izgradio obrub oko maskirane slike, ovaj pristup koristi JavaScript i Canvas API. Stroke() se koristi za ocrtavanje maskiranog oblika.

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;
    });
}

Opcija 2: Stvorite prilagođeni obrub oko oblika maske pomoću putanje platna

Ova metoda osigurava da obrub usko prati maskirani oblik slijedeći putanju maske slike pomoću Canvas API-ja s JavaScriptom.

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;
    });
}

Poboljšanje maskiranih slika prilagođenim obrubima u JavaScriptu

Korisničko iskustvo vaše JavaScript aplikacije može se uvelike poboljšati mogućnošću maskiranja slika i postavljanja prilagođenih obruba pri radu s Canvas API. Uz pomoć maskiranja možete odlučiti koja su područja slike vidljiva ovisno o drugoj slici, poznatoj kao maska. Dodavanje obruba oko maskirane zone problem je s kojim se susreću mnogi programeri, osobito kada maska ​​nije jednostavnog pravokutnog oblika. Projekti s rubovima koji točno odgovaraju obrisu maske djelovat će uglađenije i stručnije.

Korisno rješenje za ovaj problem je korištenje Canvas API-ja Put2D objekt. Možete koristiti Path2D za dizajniranje zamršenih ruta koje odgovaraju konturama vaše maske, a zatim ih okružite rubom. Ova vam metoda omogućuje generiranje obruba koji točno odgovaraju kutovima vaše prilagođene maske, nadilazeći konvencionalne pravokutnike. Korištenje moveTo() i lineTo() zajedno olakšava praćenje obrisa maske i jamči obrub koji je precizno poravnat.

Izvedba je još jedan važan čimbenik koji treba uzeti u obzir, osobito kada radite s većim slikama ili dinamičkom primjenom obruba u stvarnom vremenu. Brzina vaše aplikacije može se poboljšati primjenom strategija kao što je spremanje maskirane slike u predmemoriju, smanjenje operacija crtanja i pojednostavljenje procesa renderiranja platna. Čak i u zamršenim postavkama ili postavkama visokih performansi, možete jamčiti da postupci maskiranja i crtanja obruba teku glatko smanjenjem besmislenih radnji.

Često postavljana pitanja o maskiranju i obrubljivanju slika pomoću platna

  1. U JavaScriptu, kako mogu koristiti drugu sliku za maskiranje jedne?
  2. Korištenje 2 postaviti na 'source-in', nacrtajte masku na platnu kako biste maskirali sliku pomoću Canvas API. Kako bi se uskladila maska, ovo će izrezati primarnu sliku.
  3. Kako mogu stvoriti obrub maskirane slike koji odgovara njezinom obliku?
  4. Nakon utvrđivanja rute maske s moveTo() i lineTo(), koristite stroke() tehnika. To će vam omogućiti da zaokružite oblik maske personaliziranim rubom.
  5. Koja je svrha toDataURL() u manipulaciji platnom?
  6. Sadržaj platna pretvara se u Base64 kodiranu sliku putem toDataURL() funkcija, što ga čini jednostavnim za korištenje ili distribuciju kao PNG slike.
  7. Kako mogu optimizirati operacije platna za izvedbu?
  8. Smanjite količinu operacija crtanja i razmislite o pohranjivanju često korištenih elemenata kako biste povećali brzinu platna. Time vaša aplikacija radi glatko i smanjuje se broj ponovnih crtanja.
  9. Mogu li učitati slike različitih izvora na platnu?
  10. Da, ali kako bi slika bila dostupna bez izazivanja poteškoća s CORS-om, trebate postaviti crossOrigin vlasništvo na 'anonymous'.

Završne misli o maskiranju i granicama

U JavaScript aplikacijama maskiranje slika i primjena prilagođenih obruba na platnu učinkovit je način za stvaranje uglađenih vizualnih elemenata. Programeri imaju mogućnost manipulirati prikazivanjem i stiliziranjem slika korištenjem Canvas API i sofisticirane naredbe za crtanje kao što su moždani udar () i definicije puta.

Glatka izvedba osigurana je pažljivim optimiziranjem operacija obruba i maskiranja, posebno za veće fotografije. Ovaj vodič pruža korisnu metodu za dinamičko crtanje obruba oko nepravokutnih slika, što je korisno pri razvoju online aplikacija koje su i estetski ugodne i osjetljive.

Reference za maskiranje i tehnike obruba na platnu
  1. Detaljan vodič za korištenje Canvas API za manipuliranje slikama i maskama, uključujući operacije crtanja kao što su 4 i 2: MDN web dokumenti .
  2. Sveobuhvatno objašnjenje kako primijeniti maskiranje slike i rukovanje izvornim izvorima u JavaScriptu: Vodiči za HTML5 Canvas .
  3. Savjeti za performanse aplikacija temeljenih na platnu, s fokusom na optimizaciju operacija renderiranja slike i crtanja: Smashing Magazin .