Užmaskuotų vaizdo kraštinių įvaldymas JavaScript drobėje
Kelių paveikslėlių suliejimas yra įprastas „JavaScript“ vaizdinių efektų kūrimo veiksmas. Matomų vaizdo sričių apibrėžimas naudojant kaukę yra dažnas būdas. Nors tai naudinga kuriant unikalias formas, gali būti sudėtinga pridėti kraštinę aplink tas užmaskuotas formas. Nors drobė „JavaScript“ elementas siūlo platų vaizdo manipuliavimą, nėra lengva pakoreguoti kraštinę aplink užmaskuotą vaizdą.
Kūrėjai gali pritaikyti kaukes ir iškirpti nuotraukas išradingai naudodami Canvas API, nors pagal numatytuosius nustatymus bet kokia sugeneruota kraštinė paprastai atitinka stačiakampę drobės formą. Kai norite sukurti kraštinę, atitinkančią sudėtingos formos, apibrėžtos kauke, kraštus, tai iškyla problema. Tikslas yra stebėti tikslią kaukės kelionę už paprastos stačiakampės sienos.
Šiame įraše bus paaiškinta, kaip pritaikyti vaizdo kaukę „JavaScript“ ir, dar svarbiau, kaip užtikrinti, kad atskira užmaskuoto paveikslėlio forma būtų apsupta kraštinės. Be to, apžvelgsime funkciją, kuri užbaigia maskavimą, bet dar neturi apibrėžto krašto sprendimo.
Galite tiksliai sureguliuoti kraštinės išvaizdą, išmokę dirbti su sudėtinėmis operacijomis drobėje. Pradėkime ir pažiūrėkime, kaip naudoti „JavaScript“ drobės funkcijas, kad aplink užmaskuotą vaizdą būtų pridėta reikiama kraštinė.
komandą | Naudojimo pavyzdys |
---|---|
globalCompositeOperation | Piešimo veiksmų ant drobės kompoziciją apibrėžia ši funkcija. Pavyzdyje esantis globalCompositeOperation ='source-in' užtikrina, kad kaukės vaizdas iškirptų pagrindinį paveikslėlį, kad būtų matomos tik susikertančios sritys. |
toDataURL() | Paverčia drobės informaciją į vaizdą, užkoduotą naudojant Base64. Tai suteikia galimybę panaudoti gatavą vaizdą kaip PNG, uždėjus kaukę ir kraštinę. Pavyzdžio vaizdo išvestis sukuriama naudojant canvas.toDataURL('image/png'). |
crossOrigin | Ši funkcija laikosi saugumo apribojimų, nes leidžia drobėje naudoti paveikslėlius, įkeltus iš kito domeno. MaskImg.crossOrigin = 'anoniminis' garantuoja, kad prieiga prie kaukės vaizdo gali būti padaryta nesukeliant CORS problemų. |
beginPath() | Drobėje naudojant šį metodą galima pradėti naują kelią. Antrasis metodas iškviečia ctx.beginPath(), kad būtų užtikrinta, jog kelias priliptų prie kaukės kontūro, kai aplink užmaskuotą vaizdą nubrėžia tinkintą kraštą. |
moveTo() | Taikant šią procedūrą, brėžiniai nedaromi; vietoj to „rašiklis“ perkeliamas į naują pradžios vietą. Kraštinės pradžios taškas yra pavyzdyje naudojant ctx.moveTo(0, 0), kuris yra būtinas norint tiksliai nubrėžti kraštinę aplink kaukės ribas. |
lineTo() | Naudodamas nurodytas koordinates kaip pradžios tašką, šis metodas nubrėžia tiesią liniją. Užmaskuoto vaizdo kraštinė apibrėžiama linijomis, nubrėžtomis sprendime naudojant ctx.lineTo(maskImg.width, 0). |
stroke() | Palei nurodytą kelią nubrėžkite ribas arba linijas. Pvz., MoveTo() ir lineTo() naudojami kaukės formai apibrėžti, o tada ctx.stroke() naudojama kraštinei aplink užmaskuotą vaizdą pritaikyti. |
lineWidth | Nustato, kokio storio linijos nupieštos ant drobės. Scenarijus nustato 5 pikselių storio kraštinę aplink kaukės formą, naudojant ctx.lineWidth = 5. |
strokeStyle | Nurodo kraštinės spalvą arba stilių. Pavyzdyje kraštinės spalva nustatyta į raudoną naudojant ctx.strokeStyle ='red'. |
Atpažinimas, kaip užmaskuotam vaizdui pritaikyti kraštinę
Pateiktų scenarijų tikslas yra naudoti kitą paveikslėlį kaip vieno vaizdo kaukę, o tada naudoti Canvas API kad pridėtumėte tinkintą kraštinę aplink užmaskuotą formą. Funkcijos pradžioje sukuriami du nauji vaizdo objektai, skirti kaukei ir pagrindiniam vaizdui. Įkeliant nuotraukas iš išorinių šaltinių, kryžminės kilmės nustatymas yra būtinas siekiant išvengti problemų dėl CORS. Įkėlus abu vaizdus formuojama drobė ir jos proporcijos sureguliuojamos, kad atitiktų kaukės vaizdą. Taip išvengiama dydžio keitimo problemų piešiant vaizdą ir garantuojama, kad drobė bus paruošta darbui su atitinkamu plotu.
Tada scenarijus naudoja piešti paveikslėlį () funkcija piešti kaukės vaizdą ant drobės. Tai darant, kaukė uždedama ant drobės, kuri yra pagrindas maskavimo procedūrai. Norint tinkamai pritaikyti kaukę, visuotinė sudėtinė operacija turi būti nustatyta į „source-in“. Drobėje nurodyta išlaikyti tik tas pirminio paveikslėlio sritis, kurios sutampa su kaukės vaizdu. Iš esmės kaukė apibrėžia formą, prie kurios nukirptas pagrindinis vaizdas. Sudėtinė operacija iš naujo nustatoma į „šaltinio viršų“, kai pagrindinė nuotrauka nupiešta šioje iškirpimo srityje, todėl galima atlikti papildomus veiksmus, pvz., piešti kraštines, nepažeidžiant anksčiau nukirpto turinio.
Užmaskuotai formai uždėjus kraštinę, reikia naudoti insultas () technika. Nurodytas kelias arba forma drobėje nurodoma šia komanda. Antrajame sprendime „moveTo“ () ir „lineTo“ () derinami, kad būtų galima rankiniu būdu generuoti drobės kelią ir atsekti kaukės ribas. Naudodami šiuos metodus galite rankiniu būdu nurodyti kraštinės formą ir įsitikinti, kad ji laikosi kaukės formos, o ne stačiakampio drobės ribos. Jūs visiškai kontroliuojate sienos išvaizdą, nes linijos plotis savybė nustato kraštinės storį ir insultoStilius nuosavybė nustato jo spalvą.
Galiausiai funkcija toDataURL() naudojama drobei transformuoti į Base64 eilutę. Tai padarius, gatavas vaizdas (įskaitant kaukę ir kraštinę) paverčiamas formatu, kuris yra lengvai naudojamas kitose programos srityse arba įkeliamas į serverį. Siekiant išvengti laiko klaidų, pažadas užtikrina, kad ši operacija baigtųsi tik tada, kai abi nuotraukos bus visiškai įkeltos. Šie scenarijai parodo, kaip naudojant „JavaScript“ drobės elementą galima atlikti sudėtingus vaizdo modifikavimo metodus, įskaitant maskavimą ir dinaminės kraštinės, tiksliai atitinkančios kaukės kontūrus, pritaikymą.
1 būdas: drobės ir potėpio metodo naudojimas norint pridėti tinkintą kraštinę prie užmaskuoto vaizdo
Siekiant sukurti kraštinę aplink užmaskuotą vaizdą, šis metodas naudoja „JavaScript“ ir „Canvas“ API. Stroke() naudojamas užmaskuotai formai apibūdinti.
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 parinktis: sukurkite tinkintą kraštinę aplink kaukės formą naudodami drobės kelią
Šis metodas užtikrina, kad kraštinė tiksliai atitiktų užmaskuotą formą, sekdama vaizdo kaukės kelią, naudojant „Canvas“ API su „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;
});
}
Užmaskuotų vaizdų tobulinimas tinkintomis kraštinėmis „JavaScript“.
„JavaScript“ programos naudotojo patirtį gali labai pagerinti galimybė užmaskuoti vaizdus ir nustatyti pasirinktines kraštines dirbant su Canvas API. Naudodami maskavimą galite nuspręsti, kurios vaizdo sritys yra matomos, atsižvelgiant į kitą vaizdą, vadinamą kauke. Kraštinės pridėjimas aplink užmaskuotą zoną yra problema, su kuria susiduria daugelis kūrėjų, ypač kai kaukė nėra paprastos stačiakampio formos. Projektai su krašteliais, kurie tiksliai atitinka kaukės kontūrą, atrodys labiau patobulinti ir ekspertiški.
Naudingas šios problemos sprendimas yra naudoti Canvas API Path2D objektas. Galite naudoti „Path2D“, kad sukurtumėte sudėtingus maršrutus, atitinkančius jūsų kaukės kontūrus, ir apjuosite juos krašteliu. Šis metodas leidžia sugeneruoti kraštines, kurios tiksliai atitinka pasirinktinės kaukės kampus, o ne įprastus stačiakampius. Naudojant moveTo() ir lineTo() kartu leidžia lengviau atsekti kaukės kontūrus ir garantuoja tiksliai išlygintą kraštą.
Našumas yra dar vienas svarbus veiksnys, į kurį reikia atsižvelgti, ypač dirbant su didesniais vaizdais arba dinamiškai taikant rėmelius realiuoju laiku. Programos greitį galima padidinti naudojant tokias strategijas kaip užmaskuoto paveikslėlio išsaugojimas talpykloje, piešimo operacijų sumažinimas ir drobės atvaizdavimo proceso supaprastinimas. Net esant sudėtingiems ar didelio našumo parametrams, galite garantuoti, kad maskavimo ir kraštinių piešimo procedūros vyks sklandžiai, sumažindami beprasmių veiksmų skaičių.
Dažnai užduodami klausimai apie vaizdų maskavimą ir ribojimą naudojant drobę
- Kaip naudoti „JavaScript“ kitą vaizdą vienam užmaskuoti?
- Naudojant 2 nustatyti į 'source-in', nupieškite kaukę ant drobės, kad užmaskuotų vaizdą naudodami Canvas API. Kad atitiktų kaukę, pagrindinis vaizdas bus apkarpytas.
- Kaip galiu sukurti užmaskuoto vaizdo kraštinę, atitinkančią jo formą?
- Nustačius kaukės maršrutą su moveTo() ir lineTo(), naudokite stroke() technika. Tai leis apjuosti kaukės formą suasmenintu rėmeliu.
- Koks tikslas toDataURL() manipuliuojant drobėmis?
- Drobės turinys paverčiamas į Base64 koduotą vaizdą per toDataURL() funkcija, todėl ją paprasta naudoti arba platinti kaip PNG vaizdą.
- Kaip optimizuoti drobės operacijas, kad jos veiktų?
- Sumažinkite piešimo operacijų skaičių ir pagalvokite apie dažniausiai naudojamų elementų saugojimą, kad padidintumėte drobės greitį. Tai užtikrina sklandų programos veikimą ir sumažina perpiešimų skaičių.
- Ar galiu į drobę įkelti įvairios kilmės vaizdus?
- Taip, bet norėdami, kad vaizdas būtų pasiekiamas nesukeliant CORS sunkumų, turite nustatyti crossOrigin nuosavybė į 'anonymous'.
Paskutinės mintys apie maskavimą ir sienas
„JavaScript“ programose vaizdų maskavimas ir tinkintų kraštinių taikymas drobėje yra efektyvus būdas sukurti nugludintus vaizdinius elementus. Kūrėjai turi galimybę manipuliuoti paveikslėlių atvaizdavimu ir stiliumi naudodamiesi Canvas API ir sudėtingos piešimo komandos, pvz., insultas () ir kelio apibrėžimai.
Sklandus veikimas užtikrinamas kruopščiai optimizuojant kraštelius ir maskavimo operacijas, ypač didelėms nuotraukoms. Šioje pamokoje pateikiamas naudingas būdas dinamiškai piešti kraštines aplink ne stačiakampius vaizdus. Tai naudinga kuriant estetiškai patrauklias ir jautrias internetines programas.
Maskavimo ir kraštinių technikų drobėje nuorodos
- Išsamus naudojimo vadovas Canvas API manipuliuoti vaizdais ir kaukėmis, įskaitant piešimo operacijas, pvz 4 ir 2: MDN žiniatinklio dokumentai .
- Išsamus paaiškinimas, kaip pritaikyti vaizdo maskavimą ir tvarkyti įvairių šaltinių išteklius „JavaScript“: HTML5 drobės mokymo programos .
- Patarimai, kaip pagerinti drobės pagrindu veikiančias programas, daugiausia dėmesio skiriant vaizdo atvaizdavimo ir piešimo operacijų optimizavimui: Smashing žurnalas .