Obvladovanje maskiranih robov slik v JavaScript Canvas
Fuzija več slik je običajen korak pri ustvarjanju vizualnih učinkov JavaScript. Določitev vidnih področij slike z masko je pogosta tehnika. Čeprav je to koristno za ustvarjanje edinstvenih oblik, je lahko težko dodati obrobo okoli teh maskiranih oblik. Čeprav je platno element v JavaScriptu ponuja obsežno manipulacijo s slikami, ni lahko prilagoditi obrobe okoli slike, ki je bila maskirana.
Razvijalci lahko uporabljajo maske in izrezke slik na domiselne načine z Canvas API, čeprav se privzeto vse ustvarjene obrobe ujemajo s pravokotno obliko platna. Ko želite ustvariti obrobo, ki se ujema z robovi zapletene oblike, ki je definirana z masko, to predstavlja težavo. Cilj je slediti natančnemu potovanju maske čez pravokotno pravokotno mejo.
Ta objava bo razložila, kako uporabiti slikovno masko v JavaScriptu in, kar je še bolj pomembno, kako zagotoviti, da je posebna oblika maskirane slike obdana z robom. Poleg tega bomo pregledali funkcijo, ki dokonča maskiranje, vendar še nima določene rešitve obrobe.
Videz obrobe lahko natančno prilagodite tako, da se naučite delati s sestavljenimi operacijami na platnu. Začnimo in poglejmo, kako uporabiti funkcije platna JavaScripta za dodajanje potrebne obrobe okoli maskirane slike.
Ukaz | Primer uporabe |
---|---|
globalCompositeOperation | S to funkcijo je definirana sestava dejanj risanja na platnu. GlobalCompositeOperation ='source-in' v primeru poskrbi, da slika maske izreže glavno sliko, tako da so vidna samo področja, ki se sekajo. |
toDataURL() | Pretvori informacije o platnu v sliko, kodirano z Base64. To omogoča uporabo končne slike kot PNG po uporabi maske in obrobe. Izhod slike primera je izdelan z uporabo canvas.toDataURL('image/png'). |
crossOrigin | Ta funkcija upošteva varnostne omejitve, saj omogoča uporabo slik, naloženih iz druge domene na platnu. MaskImg.crossOrigin = 'anonymous' zagotavlja, da je dostop do slike maske mogoč brez povzročanja težav CORS. |
beginPath() | Na platnu je mogoče s to metodo začeti novo pot. Druga metoda pokliče ctx.beginPath(), da zagotovi, da se pot drži obrisa maske, ko nariše obrobo po meri okoli maskirane slike. |
moveTo() | S tem postopkom se ne izdelajo risbe; namesto tega se "pero" premakne na novo začetno mesto. Začetna točka obrobe je v primeru postavljena z uporabo ctx.moveTo(0, 0), kar je bistveno za natančno risanje obrobe okoli meja maske. |
lineTo() | Z uporabo danih koordinat kot izhodiščne točke ta tehnika nariše ravno črto. Obrobo zamaskirane slike definirajo črte, narisane v rešitvi z uporabo ctx.lineTo(maskImg.width, 0). |
stroke() | Vzdolž označene poti nariše obrobe ali črte. Na primer, moveTo() in lineTo() se uporabljata za definiranje oblike maske, nato pa se ctx.stroke() uporablja za uporabo obrobe okoli maskirane slike. |
lineWidth | Določa, kako debele so črte naslikane na platnu. Skript vzpostavi 5 slikovnih pik debelo obrobo okoli oblike maske z uporabo ctx.lineWidth = 5. |
strokeStyle | Označuje barvo ali slog obrobe. Barva obrobe v primeru je nastavljena na rdečo z uporabo ctx.strokeStyle ='red'. |
Prepoznavanje, kako uporabiti obrobo na maskirani sliki
Cilj priloženih skriptov je uporabiti drugo sliko kot masko za eno sliko in nato uporabiti sliko Canvas API da dodate obrobo po meri okoli maskirane oblike. Na začetku funkcije se ustvarita dva nova slikovna predmeta za masko in glavno sliko. Pri nalaganju fotografij iz zunanjih virov je nastavitev navzkrižnega izvora bistvena za preprečevanje težav zaradi CORS. Ko sta obe sliki naloženi, se oblikuje platno in njegova razmerja se prilagodijo tako, da ustrezajo sliki maske. S tem se izognete težavam pri spreminjanju velikosti med risanjem slike in zagotovite, da je platno pripravljeno za delo z ustreznim območjem.
Skript nato uporabi drawImage() funkcijo za risanje slike maske na platno. Pri tem se maska nanese na platno, ki služi kot temeljna plast za postopek maskiranja. Za pravilno uporabo maske mora biti globalna sestavljena operacija nastavljena na "source-in". Platnu je naročeno, da obdrži samo področja primarne slike, ki sovpadajo s sliko maske. V bistvu maska določa obliko, na katero je prirezana glavna slika. Sestavljena operacija je ponastavljena na »source-over«, ko je glavna slika narisana znotraj tega območja izrezovanja, kar omogoča dodatna dejanja, kot je barvanje robov, ne da bi to vplivalo na predhodno izrezano vsebino.
Uporaba obrobe na maskirano obliko vključuje uporabo kap() tehnika. Navedena pot ali obrazec na platnu je označen s tem ukazom. V drugi rešitvi sta moveTo() in lineTo() združena za ročno ustvarjanje poti platna in sledenje robov maske. Z uporabo teh tehnik lahko ročno določite obliko obrobe in zagotovite, da se drži oblike maske namesto pravokotne meje platna. Imate popoln nadzor nad videzom meje, ker lineWidth lastnost nastavi debelino roba in strokeStyle Lastnost nastavi svojo barvo.
Nazadnje se funkcija toDataURL() uporablja za pretvorbo platna v niz Base64. S tem se končna slika – vključno z masko in obrobo – spremeni v obliko, ki jo je mogoče takoj uporabiti v drugih delih programa ali naložiti na strežnik. Da bi se izognili časovnim napakam, obljuba poskrbi, da se ta operacija konča šele, ko sta obe sliki popolnoma naloženi. Ti skripti prikazujejo, kako je mogoče prefinjene tehnike spreminjanja slike, vključno z maskiranjem in uporabo dinamične obrobe, ki se natančno ujema s konturami maske, doseči z elementom platna JavaScripta.
1. način: Uporaba metode Canvas in Stroke za dodajanje obrobe po meri maskirani sliki
Za izgradnjo obrobe okoli maskirane slike ta pristop uporablja JavaScript in Canvas API. Stroke() se uporablja za obris maskirane oblike.
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. možnost: ustvarite obrobo po meri okoli oblike maske s pomočjo poti platna
Ta metoda zagotavlja, da obroba natančno sledi maskirani obliki, tako da sledi poti maske slike z uporabo API-ja Canvas z 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;
});
}
Izboljšanje maskiranih slik z obrobami po meri v JavaScriptu
Uporabniško izkušnjo vaše aplikacije JavaScript je mogoče močno izboljšati z možnostjo maskiranja slik in nastavljanja obrob po meri pri delu z Canvas API. S pomočjo maskiranja se lahko odločite, katera področja slike so vidna glede na drugo sliko, znano kot maska. Dodajanje obrobe okrog maskiranega območja je težava, s katero se srečujejo številni razvijalci, zlasti če maska ni enostavne pravokotne oblike. Projekti z obrobami, ki se natančno ujemajo z obrisom maske, bodo videti bolj uglajeni in strokovni.
Uporabna rešitev te težave je uporaba API-ja Canvas Pot2D predmet. Path2D lahko uporabite za oblikovanje zapletenih poti, ki se prilegajo obrisom vaše maske in jih nato obdate z robom. Ta metoda vam omogoča ustvarjanje obrob, ki se natančno ujemajo z vogali vaše maske po meri in presegajo običajne pravokotnike. Uporaba moveTo() in lineTo() skupaj omogoča lažje sledenje obrisu maske in zagotavlja natančno poravnano obrobo.
Zmogljivost je še en pomemben dejavnik, ki ga je treba upoštevati, zlasti pri delu z večjimi slikami ali dinamični uporabi obrob v realnem času. Hitrost vaše aplikacije je mogoče izboljšati z uporabo strategij, kot je predpomnjenje maskirane slike, zmanjšanje operacij risanja in poenostavitev postopka upodabljanja platna. Tudi v zapletenih ali visoko zmogljivih nastavitvah lahko zagotovite, da postopki maskiranja in risanja robov potekajo gladko z zmanjšanjem nesmiselnih dejanj.
Pogosta vprašanja o maskiranju in obrobljanju slik s platnom
- Kako lahko v JavaScriptu uporabim drugo sliko za maskiranje ene?
- Uporaba 2 nastavite na 'source-in', narišite masko na platno, da zakrijete sliko z uporabo Canvas API. Da bi se ujemala z masko, bo to obrezalo primarno sliko.
- Kako lahko ustvarim obrobo maskirane slike, ki ustreza njeni obliki?
- Po vzpostavitvi poti maske z moveTo() in lineTo(), uporabite stroke() tehnika. To vam bo omogočilo, da obkrožite obliko maske s prilagojenim robom.
- Kaj je namen toDataURL() v manipulaciji s platnom?
- Vsebina platna se pretvori v sliko, kodirano z Base64 prek toDataURL() funkcija, ki omogoča preprosto uporabo ali distribucijo kot sliko PNG.
- Kako lahko optimiziram operacije platna za učinkovitost?
- Zmanjšajte število operacij risanja in razmislite o shranjevanju pogosto uporabljenih elementov, da povečate hitrost platna. Tako vaša aplikacija deluje nemoteno in zmanjša število ponovnih risb.
- Ali lahko na platno naložim slike drugega izvora?
- Da, toda če želite, da bo slika na voljo brez povzročanja težav CORS, morate nastaviti crossOrigin premoženje do 'anonymous'.
Končne misli o maskiranju in mejah
V aplikacijah JavaScript je maskiranje slik in uporaba obrob po meri na platnu učinkovit način za ustvarjanje uglajenih vizualnih elementov. Razvijalci imajo možnost, da manipulirajo z upodabljanjem in oblikovanjem slik z uporabo Canvas API in sofisticirane ukaze za risanje, kot je npr kap() in definicije poti.
Nemoteno delovanje je zagotovljeno s skrbnim optimiziranjem operacij obrob in mask, zlasti za večje fotografije. Ta vadnica ponuja uporabno metodo za dinamično slikanje obrob okrog nepravokotnih slik, kar je uporabno pri razvoju spletnih aplikacij, ki so tako estetsko prijetne kot odzivne.
Reference za tehnike maskiranja in obrobe na platnu
- Podroben vodnik za uporabo Canvas API za manipulacijo slik in mask, vključno z risalnimi operacijami, kot je 4 in 2: Spletni dokumenti MDN .
- Izčrpna razlaga uporabe maskiranja slike in ravnanja z viri navzkrižnega izvora v JavaScriptu: Vadnice za platno HTML5 .
- Nasveti za zmogljivost za aplikacije, ki temeljijo na platnu, s poudarkom na optimizaciji upodabljanja slik in postopkov risanja: Revija Smashing .