Advertisement
giganciprogramowania

l16 js

May 23rd, 2023
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. //tworzymy zmienne, dzięki którym uzyskamy dostęp do kluczowych elementów HTML w projekcie
  2. //tworzymy je jako stałe bo nie będziemy im już przypisywać innych wartości
  3. const choosenPicture = document.querySelector("#select-picture");
  4. const canvas = document.querySelector("#meme");
  5. const textTop = document.querySelector("#text-top");
  6. const textBottom = document.querySelector("#text-bottom");
  7. const downloadButton = document.querySelector('#download-button');
  8. //zmienna globalna przechowująca nasz wybrany obrazek w formie URL
  9. let picture;
  10.  
  11. //ukrywamy przycisk pobierz
  12. downloadButton.style.display='none';
  13.  
  14. //Na przycisku, którym wybieramy obrazki ustawiamy tzw obserwator zdarzeń którego zadanie będzie monitorować każdą zmiane tego elementu
  15. //dla nas ozacza to tyle że jak wybierzemy obrazek to kod dla zdarzenia zostanie wykonany
  16. //parametr e(event) przekazuje informacje o danym zdarzeniu i elemencie
  17. choosenPicture.addEventListener("change", function(e){
  18.  
  19. //tworzymy ciąg znaków (URL), który będzie repreznetować nasz obiekt obrazka i ułatwi to jego wykorzystanie w kodzie
  20. //jako parametr metoda ta przyjmuje plik, wykorzystujemy parametr e aby zwrócić pierwszy obrazek, który wybraliśmy
  21. const pictureUrl = URL.createObjectURL(e.target.files[0]);
  22.  
  23. //konstruktor ten tworzy nam nowy elelemnt html - <img>
  24. picture = new Image();
  25. //ustawiamy ścieżkę do obrazka
  26. picture.src = pictureUrl;
  27.  
  28. //wczytywanie obrazka po wybraniu w canvasie
  29. picture.addEventListener("load",function(){
  30. console.log('wczytywanie obrazka...');
  31. updateMeme(canvas,picture,textTop.value,textBottom.value);
  32. });
  33. downloadButton.style.display='block';
  34. });
  35.  
  36.  
  37. //na jakąkolwiek zmianę w inpucie tekstu górnego odświeżamy obrazek w canvasie
  38. textTop.addEventListener("change", function(){
  39.  
  40. updateMeme(canvas, picture, textTop.value,textBottom.value);
  41. });
  42.  
  43. //na jakąkolwiek zmianę w inpucie tekstu dolnego odświeżamy picture w canvasie
  44. textBottom.addEventListener("change", function(){
  45.  
  46. updateMeme(canvas, picture, textTop.value,textBottom.value);
  47. });
  48.  
  49. //funckja odpowiedzialna za ładowanie obrazka w canvasie oraz dodowanie napisu górnego i dolnego
  50.  
  51. function updateMeme(canvas, picture,textTop,textBottom) {
  52. //ustawiamy kontekst renderowania w canvasie w naszym przypadku będzie to 2D
  53. const ctx = canvas.getContext("2d");
  54. //szerokość i wysokość canvy ustawiamy na parametry obrazka
  55.  
  56. //wgrywanie małych obrazków zakończy się pikselozą
  57. const canvasWidth = picture.width;
  58. const canvasHeight = picture.height;
  59. //Wielkość czcionki będzie zależna od szerokośći obrazka jeśli chcemy zmienić to w tym miejscu można edytować wartosć
  60. // Math.floor zaokrągla do najmniejszej lub największej liczby całkowitej
  61.  
  62. const fontSize = Math.floor(canvasWidth / 20);
  63. //odstępy napisów od górnej i dolenej krawędzi zdjęcia im mniejsza wartość tym napisy będą bliżej środka
  64. const offsetY = canvasHeight / 25;
  65.  
  66. //ustawiamy szerokść i wysokość naszego płótna na wymaery obrazka
  67. canvas.width = canvasWidth;
  68. canvas.height = canvasHeight;
  69. //metoda ta rysyuje obrazek w canvasie kordy 0 , 0 wskazują miesce rozpoczęcia rysowania lewy - górny róg canvasu
  70. ctx.drawImage(picture, 0, 0);
  71.  
  72.  
  73. // Przygotowanie tekstu https://www.w3schools.com/tags/ref_canvas.asp
  74.  
  75. //kolor obramowań liter
  76. ctx.strokeStyle = "black";
  77. //szerokość obramowańa liter
  78. ctx.lineWidth = Math.floor(fontSize / 4);
  79. //kolor wypełnienia litery
  80. ctx.fillStyle = "white";
  81. //wyśrodkowanie tesktu
  82. ctx.textAlign = "center";
  83. //zaokrąglenie obramowania
  84. ctx.lineJoin = "round";
  85. ctx.font = `${fontSize}px Lato`;
  86.  
  87.  
  88. //przygotowanie górnego tekstu
  89. //ustawiamy linię bazową od której zaczynamy rysować tekst
  90. ctx.textBaseline = "top";
  91. //rysujemy tekst bez wypełnienia
  92. ctx.strokeText(textTop, canvasWidth / 2, offsetY);
  93. //dodajemy wypełnienie
  94. ctx.fillText(textTop, canvasWidth / 2, offsetY);
  95.  
  96.  
  97.  
  98. // przygotowanie dolnego tekstu
  99. ctx.textBaseline = "bottom";
  100. ctx.strokeText(textBottom, canvasWidth / 2, canvasHeight - offsetY);
  101. ctx.fillText(textBottom, canvasWidth / 2, canvasHeight - offsetY);
  102.  
  103. }
  104.  
  105.  
  106. //OPCJONALNIE przycisk do pobierania obrazka
  107.  
  108. // Konwertujemy canvas do obrazka po klknięciu przycisku pobierz
  109. downloadButton.addEventListener("click", function() {
  110.  
  111. const dataURL = canvas.toDataURL("image/jpeg");
  112.  
  113. //tworzymy nowy znacznik <a> z ustawioną ścieżką do naszego obrazka,
  114. const a = document.createElement('a');
  115. a.href = dataURL;
  116. //ustawiamy atrybut download wraz z nazwą pobranego pliku
  117. a.download = 'meme.jpeg';
  118. //wywołujemy metodę klik na nowo utworzonym elemencie w efekcie zdjęcie pobierze się automatycznie
  119. a.click();
  120. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement