Advertisement
ada1711

cg-16-meme-generator

Jan 12th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // we create variables to access key HTML elements in the project
  2. //we create them as constants because we won't be assigning other values to them anymore
  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. //global variable storing our selected image as a URL
  9. let picture;
  10.  
  11. //we hide the download button
  12. downloadButton.style.display='none';
  13.  
  14. // On the button where we select images we set the so-called event observer whose task will be to monitor each change of this element
  15.  
  16. // what this means for us is that when we select an image, the code for the event will be executed
  17.  
  18. // the e(event) parameter passes information about the event and the element
  19. choosenPicture.addEventListener("change", function (e) {
  20.   // we create a string (URL) that will represent our image object and this will facilitate its use in the code
  21.   // this method takes a file as a parameter, we use the e parameter to return the first picture we selected
  22.   const pictureUrl = URL.createObjectURL(e.target.files[0]);
  23.  
  24.   // this constructor creates a new html element for us - <img>.
  25.   picture = new Image();
  26.   // we set the path to the image
  27.   picture.src = pictureUrl;
  28.  
  29.   // load the image when selected in the canvas
  30.   picture.addEventListener("load", function () {
  31.     // test add information in the console to check if the picture was loaded correctly
  32.     console.log("Loading the image...");
  33.     updateMeme(canvas, picture, textTop.value,textBottom.value);
  34.   });
  35.   downloadButton.style.display='block';
  36. });
  37.  
  38. //function responsible for loading the canvas picture and adding the top and bottom caption
  39.  
  40. function updateMeme(canvas, picture, textTop, textBottom) {
  41.   //set the rendering context in the canvas in our case it will be 2D
  42.   const ctx = canvas.getContext("2d");
  43.   //we set the width and height of the canva to the image parameters
  44.  
  45.   //uploading small images will end up bad quality
  46.   const canvasWidth = picture.width;
  47.   const canvasHeight = picture.height;
  48.   // The font size will depend on the width of the picture if you want to change it, you can edit the value here
  49.   // Math.floor rounds to the smallest or largest integer
  50.  
  51.   const fontSize = Math.floor(canvasWidth / 20);
  52.   // the spacing of the captions from the top and bottom edges of the image the smaller the value, the closer the captions will be to the center
  53.   const offsetY = canvasHeight / 25;
  54.  
  55.   //set the width and height of our canvas to the size of the image
  56.   canvas.width = canvasWidth;
  57.   canvas.height = canvasHeight;
  58.   //this method draws the image in the canvas cord 0 , 0 indicate where to start drawing the left - top corner of the canvas
  59.   ctx.drawImage(picture, 0, 0);
  60.  
  61.   // text preparation https://www.w3schools.com/tags/ref_canvas.asp
  62.  
  63.   // color of letter borders
  64.   ctx.strokeStyle = "black";
  65.   // width of the letter border
  66.   ctx.lineWidth = Math.floor(fontSize / 4);
  67.   //the color of the letter fill
  68.   ctx.fillStyle = "white";
  69.   //centering of the text
  70.   ctx.textAlign = "center";
  71.   //rounding of the border
  72.   ctx.lineJoin = "round";
  73.   ctx.font = `${fontSize}px Summer`;
  74.  
  75.   //setting the top text
  76.   //set the baseline from which we start drawing the text
  77.   ctx.textBaseline = "top";
  78.   //we draw the text without filling
  79.   ctx.strokeText(textTop, canvasWidth / 2, offsetY);
  80.   //we add a fill
  81.   ctx.fillText(textTop, canvasWidth / 2, offsetY);
  82.  
  83.   // prepare the bottom text
  84.   ctx.textBaseline = "bottom";
  85.   ctx.strokeText(textBottom, canvasWidth / 2, canvasHeight - offsetY);
  86.   ctx.fillText(textBottom, canvasWidth / 2, canvasHeight - offsetY);
  87. }
  88.  
  89. //for any change in the top text input, we refresh the canvas image
  90. textTop.addEventListener("change", function () {
  91.   updateMeme(canvas, picture, textTop.value, textBottom.value);
  92. });
  93.  
  94. textBottom.addEventListener("change", function () {
  95.   updateMeme(canvas, picture, textTop.value, textBottom.value);
  96. });
  97.  
  98. // OPTIONAL button to download image
  99. // We convert the canvas to an image when the download button is clicked
  100. downloadButton.addEventListener("click", function() {
  101.  
  102.  
  103.     const dataURL = canvas.toDataURL("image/jpeg");
  104.  
  105.  
  106.    // we create a new <a> tag with the path to our image set,
  107.     const a = document.createElement('a');
  108.     a.href = dataURL;
  109.   // we set the download attribute with the name of the downloaded file
  110.     a.download = 'meme.jpeg';
  111.   // we call the click method on the newly created element as a result the photo will download automatically
  112.     a.click();
  113. });
  114.  
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement