//tworzymy zmienne, dzięki którym uzyskamy dostęp do kluczowych elementów HTML w projekcie //tworzymy je jako stałe bo nie będziemy im już przypisywać innych wartości const choosenPicture = document.querySelector("#select-picture"); const canvas = document.querySelector("#meme"); const textTop = document.querySelector("#text-top"); const textBottom = document.querySelector("#text-bottom"); const downloadButton = document.querySelector('#download-button'); //zmienna globalna przechowująca nasz wybrany obrazek w formie URL let picture; //ukrywamy przycisk pobierz downloadButton.style.display='none'; //Na przycisku, którym wybieramy obrazki ustawiamy tzw obserwator zdarzeń którego zadanie będzie monitorować każdą zmiane tego elementu //dla nas ozacza to tyle że jak wybierzemy obrazek to kod dla zdarzenia zostanie wykonany //parametr e(event) przekazuje informacje o danym zdarzeniu i elemencie choosenPicture.addEventListener("change", function(e){ //tworzymy ciąg znaków (URL), który będzie repreznetować nasz obiekt obrazka i ułatwi to jego wykorzystanie w kodzie //jako parametr metoda ta przyjmuje plik, wykorzystujemy parametr e aby zwrócić pierwszy obrazek, który wybraliśmy const pictureUrl = URL.createObjectURL(e.target.files[0]); //konstruktor ten tworzy nam nowy elelemnt html - picture = new Image(); //ustawiamy ścieżkę do obrazka picture.src = pictureUrl; //wczytywanie obrazka po wybraniu w canvasie picture.addEventListener("load",function(){ console.log('wczytywanie obrazka...'); updateMeme(canvas,picture,textTop.value,textBottom.value); }); downloadButton.style.display='block'; }); //na jakąkolwiek zmianę w inpucie tekstu górnego odświeżamy obrazek w canvasie textTop.addEventListener("change", function(){ updateMeme(canvas, picture, textTop.value,textBottom.value); }); //na jakąkolwiek zmianę w inpucie tekstu dolnego odświeżamy picture w canvasie textBottom.addEventListener("change", function(){ updateMeme(canvas, picture, textTop.value,textBottom.value); }); //funckja odpowiedzialna za ładowanie obrazka w canvasie oraz dodowanie napisu górnego i dolnego function updateMeme(canvas, picture,textTop,textBottom) { //ustawiamy kontekst renderowania w canvasie w naszym przypadku będzie to 2D const ctx = canvas.getContext("2d"); //szerokość i wysokość canvy ustawiamy na parametry obrazka //wgrywanie małych obrazków zakończy się pikselozą const canvasWidth = picture.width; const canvasHeight = picture.height; //Wielkość czcionki będzie zależna od szerokośći obrazka jeśli chcemy zmienić to w tym miejscu można edytować wartosć // Math.floor zaokrągla do najmniejszej lub największej liczby całkowitej const fontSize = Math.floor(canvasWidth / 20); //odstępy napisów od górnej i dolenej krawędzi zdjęcia im mniejsza wartość tym napisy będą bliżej środka const offsetY = canvasHeight / 25; //ustawiamy szerokść i wysokość naszego płótna na wymaery obrazka canvas.width = canvasWidth; canvas.height = canvasHeight; //metoda ta rysyuje obrazek w canvasie kordy 0 , 0 wskazują miesce rozpoczęcia rysowania lewy - górny róg canvasu ctx.drawImage(picture, 0, 0); // Przygotowanie tekstu https://www.w3schools.com/tags/ref_canvas.asp //kolor obramowań liter ctx.strokeStyle = "black"; //szerokość obramowańa liter ctx.lineWidth = Math.floor(fontSize / 4); //kolor wypełnienia litery ctx.fillStyle = "white"; //wyśrodkowanie tesktu ctx.textAlign = "center"; //zaokrąglenie obramowania ctx.lineJoin = "round"; ctx.font = `${fontSize}px Lato`; //przygotowanie górnego tekstu //ustawiamy linię bazową od której zaczynamy rysować tekst ctx.textBaseline = "top"; //rysujemy tekst bez wypełnienia ctx.strokeText(textTop, canvasWidth / 2, offsetY); //dodajemy wypełnienie ctx.fillText(textTop, canvasWidth / 2, offsetY); // przygotowanie dolnego tekstu ctx.textBaseline = "bottom"; ctx.strokeText(textBottom, canvasWidth / 2, canvasHeight - offsetY); ctx.fillText(textBottom, canvasWidth / 2, canvasHeight - offsetY); } //OPCJONALNIE przycisk do pobierania obrazka // Konwertujemy canvas do obrazka po klknięciu przycisku pobierz downloadButton.addEventListener("click", function() { const dataURL = canvas.toDataURL("image/jpeg"); //tworzymy nowy znacznik z ustawioną ścieżką do naszego obrazka, const a = document.createElement('a'); a.href = dataURL; //ustawiamy atrybut download wraz z nazwą pobranego pliku a.download = 'meme.jpeg'; //wywołujemy metodę klik na nowo utworzonym elemencie w efekcie zdjęcie pobierze się automatycznie a.click(); });