Mestring av maskerte bildekanter i JavaScript Canvas
Fusjon av flere bilder er et vanlig trinn i å lage visuelle JavaScript-effekter. Å definere de synlige områdene av et bilde med en maske er en hyppig teknikk. Selv om dette er nyttig for å lage unike former, kan det være utfordrende å legge til en kant rundt de maskerte formene. Selv om lerret element i JavaScript tilbyr omfattende bildemanipulering, det er ikke lett å justere rammen rundt et bilde som har blitt maskert.
Utviklere kan bruke masker og klippe bilder på fantasifulle måter med Canvas API, selv om som standard har enhver kant som genereres en tendens til å matche den rektangulære formen på lerretet. Når du ønsker å lage en kantlinje som matcher kantene på en komplisert form som er definert av en maske, er dette et problem. Målet er å følge maskens nøyaktige reise utover den enkle rektangulære grensen.
Dette innlegget vil forklare hvordan du bruker en bildemaske i JavaScript og, mer avgjørende, hvordan du sørger for at den distinkte formen til det maskerte bildet er omgitt av en kant. I tillegg vil vi gå gjennom en funksjon som fullfører maskeringen, men som ennå ikke har en definert kantløsning.
Du kan finjustere kantens utseende ved å lære hvordan du arbeider med sammensatte operasjoner i lerret. La oss komme i gang og se hvordan du bruker JavaScripts lerretsfunksjoner for å legge til den nødvendige rammen rundt et maskert bilde.
Kommando | Eksempel på bruk |
---|---|
globalCompositeOperation | Sammensetningen av tegnehandlinger på lerretet er definert av denne funksjonen. GlobalCompositeOperation ='source-in' i eksemplet sørger for at maskebildet klipper hovedbildet slik at bare områdene som skjærer hverandre blir sett. |
toDataURL() | Transformerer informasjonen på lerretet til et bilde kodet med Base64. Dette gjør det mulig å bruke det ferdige bildet som en PNG etter påføring av maske og kant. Eksemplets bildeutgang produseres ved å bruke canvas.toDataURL('image/png'). |
crossOrigin | Denne funksjonen respekterer sikkerhetsrestriksjoner ved å muliggjøre bruk av bilder lastet fra et annet domene i lerretet. MaskImg.crossOrigin = 'anonym' garanterer at tilgang til maskebildet kan gjøres uten å forårsake CORS-problemer. |
beginPath() | På lerretet kan en ny bane startes ved hjelp av denne metoden. Den andre metoden kaller ctx.beginPath() for å sikre at banen holder seg til maskens kontur når den tegner en egendefinert kant rundt det maskerte bildet. |
moveTo() | Med denne prosedyren lages ingen tegninger; i stedet flyttes "pennen" til et nytt begynnelsessted. Grensens startpunkt er plassert i eksemplet ved å bruke ctx.moveTo(0, 0), som er avgjørende for å tegne grensen nøyaktig rundt maskens grenser. |
lineTo() | Ved å bruke de gitte koordinatene som utgangspunkt, tegner denne teknikken en rett linje. Grensen til det maskerte bildet er definert av linjene som er tegnet i løsningen ved å bruke ctx.lineTo(maskImg.width, 0). |
stroke() | Tegner grenser eller linjer langs den angitte banen. For eksempel brukes moveTo() og lineTo() til å definere maskeformen, og deretter brukes ctx.stroke() til å bruke rammen rundt det maskerte bildet. |
lineWidth | Bestemmer hvor tykke linjene er malt på lerretet. Skriptet etablerer en 5-piksel tykk kant rundt maskens form ved å bruke ctx.lineWidth = 5. |
strokeStyle | Indikerer kantens farge eller stil. Kantfargen i eksemplet er satt til rød ved å bruke ctx.strokeStyle ='red'. |
Gjenkjenne hvordan du legger en kantlinje på et maskert bilde
Målet med skriptene som leveres er å bruke et annet bilde som en maske for ett bilde, og deretter bruke Canvas API for å legge til en egendefinert kant rundt den maskerte formen. To nye bildeobjekter opprettes i starten av funksjonen for masken og hovedbildet. Når du laster inn bilder fra eksterne kilder, er kryssopprinnelsesinnstillingen viktig for å forhindre problemer på grunn av CORS. Et lerret dannes og proporsjonene justeres for å matche maskebildet når begge bildene er lastet inn. Dette unngår problemer med å endre størrelse under bildetegning og garanterer at lerretet er klargjort for arbeid med riktig område.
Skriptet bruker deretter drawImage() funksjon for å tegne maskebildet på lerretet. Ved å gjøre dette påføres masken på lerretet, og fungerer som grunnlaget for maskeringsprosedyren. Den globale sammensatte operasjonen må settes til "kilde-inn" for å bruke masken riktig. Lerretet blir bedt om å beholde bare de områdene av primærbildet som sammenfaller med maskebildet. I hovedsak definerer masken formen som hovedbildet er klippet til. Den sammensatte operasjonen tilbakestilles til "kildeover" når hovedbildet tegnes inne i dette klippeområdet, noe som muliggjør ytterligere handlinger som kantmaling uten å påvirke det tidligere klippede innholdet.
Å bruke en kantlinje på den maskerte formen innebærer å bruke slag() teknikk. Den angitte banen eller skjemaet på lerretet indikeres av denne kommandoen. I den andre løsningen kombineres moveTo() og lineTo() for å generere lerretsbanen manuelt og spore maskens kantlinjer. Med bruk av disse teknikkene kan du manuelt spesifisere kantens form og sørge for at den fester seg til maskens form i stedet for den rektangulære lerretsgrensen. Du har full kontroll over grensens utseende fordi linjebredde egenskapen setter grensens tykkelse og slagstil egenskapen setter fargen.
Til slutt brukes toDataURL()-funksjonen til å transformere lerretet til en Base64-streng. Ved å gjøre dette, blir det ferdige bildet – maske og kant inkludert – forvandlet til et format som lett kan brukes i andre områder av programmet eller lastes opp til en server. For å unngå tidsfeil, sørger løftet for at denne operasjonen først avsluttes når begge bildene er fullastet. Disse skriptene viser hvordan sofistikerte bildemodifikasjonsteknikker, inkludert maskering og bruk av en dynamisk kant som samsvarer nøyaktig med maskens konturer, kan oppnås med JavaScripts lerretselement.
Metode 1: Bruke Canvas and Stroke-metoden for å legge til en tilpasset kantlinje til et maskert bilde
For å bygge en kant rundt det maskerte bildet, bruker denne tilnærmingen JavaScript og Canvas API. Stroke() brukes til å skissere den maskerte formen.
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;
});
}
Alternativ 2: Lag en egendefinert kant rundt maskeformen ved å bruke lerretsbane
Denne metoden sikrer at kantlinjen følger den maskerte formen tett ved å følge bildemaskebanen ved å bruke Canvas API med 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;
});
}
Forbedre maskerte bilder med tilpassede rammer i JavaScript
Brukeropplevelsen av JavaScript-applikasjonen din kan forbedres betraktelig av muligheten til å maskere bilder og angi tilpassede grenser når du arbeider med Canvas API. Ved hjelp av maskering kan du bestemme hvilke områder av et bilde som er synlige, avhengig av et annet bilde, kjent som masken. Å legge til en kant rundt den maskerte sonen er et problem som mange utviklere møter, spesielt når masken ikke har en enkel rektangulær form. Prosjekter med kanter som samsvarer nøyaktig med maskens omriss vil fremstå som mer polerte og eksperter.
En nyttig løsning på dette problemet er å bruke Canvas API Path2D gjenstand. Du kan bruke Path2D til å designe intrikate ruter som passer til konturene til masken din og deretter omgi dem med en kant. Denne metoden lar deg generere kantlinjer som nøyaktig matcher hjørnene på din egendefinerte maske, og går utover konvensjonelle rektangler. Bruker moveTo() og lineTo() sammen gjør det lettere å spore maskens omriss og garanterer en kant som er nøyaktig justert.
Ytelse er en annen viktig faktor å ta hensyn til, spesielt når du arbeider med større bilder eller bruker grenser dynamisk i sanntid. Applikasjonens hastighet kan forbedres ved å bruke strategier som å bufre det maskerte bildet, kutte ned på tegneoperasjoner og strømlinjeforme lerretsgjengivelsesprosessen. Selv i intrikate eller høyytelsesinnstillinger kan du garantere at prosedyrene for maskering og kanttegning går jevnt ved å redusere meningsløse handlinger.
Ofte stilte spørsmål om maskering og avgrensning av bilder ved bruk av lerret
- Hvordan kan jeg bruke et annet bilde til å maskere et i JavaScript?
- Bruker 2 satt til 'source-in', tegn masken på lerretet for å maskere et bilde ved hjelp av Canvas API. For å matche masken vil dette beskjære primærbildet.
- Hvordan kan jeg lage en kantlinje til et maskert bilde som samsvarer med formen?
- Etter å ha etablert maskens rute med moveTo() og lineTo(), bruk stroke() teknikk. Dette lar deg omkranse maskens form med en personlig kant.
- Hva er hensikten med toDataURL() i lerretsmanipulasjon?
- Innholdet i lerretet omdannes til et Base64-kodet bilde via toDataURL() funksjon, noe som gjør det enkelt å bruke eller distribuere som et PNG-bilde.
- Hvordan kan jeg optimalisere lerretsoperasjoner for ytelse?
- Reduser mengden tegneoperasjoner og tenk på å lagre ofte brukte elementer for å maksimere lerretshastigheten. Dette sørger for at applikasjonen din fungerer jevnt og reduserer antallet omtegninger.
- Kan jeg laste inn bilder med kryssopprinnelse i et lerret?
- Ja, men for å gjøre bildet tilgjengelig uten å forårsake CORS-problemer, må du stille inn crossOrigin eiendom til 'anonymous'.
Siste tanker om maskering og grenser
I JavaScript-apper er maskering av bilder og bruk av egendefinerte rammer i lerretet en effektiv måte å lage polerte visuelle elementer på. Utviklere har muligheten til å manipulere gjengivelsen og stylingen av bilder ved å bruke Canvas API og sofistikerte tegnekommandoer som f.eks slag() og veidefinisjoner.
Jevn ytelse sikres ved å nøye optimalisere kant- og maskeringsoperasjonene, spesielt for større bilder. Denne opplæringen gir en nyttig metode for dynamisk å male grenser rundt ikke-rektangulære bilder, noe som er nyttig når du utvikler nettapper som er både estetisk tiltalende og responsive.
Referanser for maskering og grenseteknikker i lerret
- Detaljert veiledning for bruk Canvas API å manipulere bilder og masker, inkludert tegneoperasjoner som 4 og 2: MDN Web Docs .
- Omfattende forklaring på hvordan du bruker bildemaskering og håndtering av kryssopprinnelsesressurser i JavaScript: HTML5 Canvas Tutorials .
- Ytelsestips for lerretsbaserte applikasjoner, med fokus på optimalisering av bildegjengivelse og tegneoperasjoner: Smashing Magazine .