I am trying to make a Chrome extension. I am trying to take screenshots using the video method in JavaScript, and then drawing the video frame on canvas, then getting image Data using getImageData(), but it's still not working it is giving data with 0 values like this:
I tried all methods on stack Overflow like using the onload method and others but still nothing works for me.
I am sorry the code is over commented for better understanding because I always write messy code here is the code:
//A function to take screenshot
const takeSnip = async () => {
try {
//Creating stream to capture a single frame of the current tab video
const stream = await navigator.mediaDevices.getDisplayMedia({ preferCurrentTab: true });
//Creating video element
const video = document.createElement('video');
//Creating canvas element
const canvas = document.createElement('canvas');
//Some styling to the canvas
canvas.style.position = 'absolute';
canvas.style.margin = 'auto';
//Creating context
const CTX = canvas.getContext('2d');
//Adding event listener to the video
video.addEventListener('loadedmetadata', () => {
//Defining the width height of the canvas
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
//Playing the video
video.play()
//Drawing the image on the canvas
CTX.drawImage(video, 0, 0, canvas.width, canvas.height);
//Stopping the video on first frame as a screenshot
stream.getVideoTracks()[0].stop();
//Adding the canvas to the body
document.body.appendChild(canvas)
})
//Getting image data from the drawn image on canvas
const imageData = CTX.getImageData(0, 0, canvas.width, canvas.height);
video.srcObject = stream;
//Printing the imagedata on the console
console.log(imageData.data) //It is getting all the data with 0 values as shown above
} catch (error) {
console.log(error);
}
}

Just move the
getImageData()inside theadddEventListener()that would work fine.