Hvordan bruke JavaScripts lerret til å legge til en tilpasset kantlinje til et maskert bilde

Masked images

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 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 , 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 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 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 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 egenskapen setter grensens tykkelse og 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 . 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 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 og 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.

  1. Hvordan kan jeg bruke et annet bilde til å maskere et i JavaScript?
  2. Bruker satt til , tegn masken på lerretet for å maskere et bilde ved hjelp av . For å matche masken vil dette beskjære primærbildet.
  3. Hvordan kan jeg lage en kantlinje til et maskert bilde som samsvarer med formen?
  4. Etter å ha etablert maskens rute med og , bruk teknikk. Dette lar deg omkranse maskens form med en personlig kant.
  5. Hva er hensikten med i lerretsmanipulasjon?
  6. Innholdet i lerretet omdannes til et Base64-kodet bilde via funksjon, noe som gjør det enkelt å bruke eller distribuere som et PNG-bilde.
  7. Hvordan kan jeg optimalisere lerretsoperasjoner for ytelse?
  8. 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.
  9. Kan jeg laste inn bilder med kryssopprinnelse i et lerret?
  10. Ja, men for å gjøre bildet tilgjengelig uten å forårsake CORS-problemer, må du stille inn eiendom til .

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 og sofistikerte tegnekommandoer som f.eks 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.

  1. Detaljert veiledning for bruk å manipulere bilder og masker, inkludert tegneoperasjoner som og : MDN Web Docs .
  2. Omfattende forklaring på hvordan du bruker bildemaskering og håndtering av kryssopprinnelsesressurser i JavaScript: HTML5 Canvas Tutorials .
  3. Ytelsestips for lerretsbaserte applikasjoner, med fokus på optimalisering av bildegjengivelse og tegneoperasjoner: Smashing Magazine .