This is another example.
Assuming you already have a canvas and want to do some modifications.
for example, you may use html2canvas.js, which will return a canvas for you, but you may want to edit it...
But as an example, I don't want to involve too many unrelated packages, so in my example, I use a simple method to generate a canvas
Example
<img id="original">
<br>
<button>click me</button>
<br>
<script>
window.onload = () => {
// Create a canvas to represent a canvas generated by your programs.
const img = document.querySelector(`#original`)
const orgCanvas = document.createElement(`canvas`)
const orgCanvasCtx = orgCanvas.getContext(`2d`)
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAA1JJREFUaEPtmlmoTVEYx3/nTRkiUaYHSoREhgwpU3gwhjdPXkik3IQkbombBykPhjwoeaHMmQsvIkOIMpYnmZIhTxL9b9+qbd+99j777rOds0971e109lrrW9//+/+/b629zq1Q8FYpuP80FYCzwHigf4Oz8g64DyySn46BPw3utM+9igDsBjYXFECbADwHhhUUwAsBKKp82mNeAqi39EoGSgYyRqCUUMYAZp6eloHPwC5gCTAt8+o1MJAWwFjgA/AS6Bax/ozQM40ZaUeVnjXwt4OJNABuAnJwB7Dd44zveD4GOAcMqjWIagDorDQEuA18AiYA34HREc7I3nTghvWdBx4a6LXA/v8JQFJZDNyxRWcCj4Av9l2OHgMGBpwKA1DXM2CUHRgVDLUnATv6LltqYlltHNA9YNc9HwAMDQYhjoGlwKmYiI0ATpjG3bAoAOqT9OSEDo4ngXWWS26ek6U+W4HrwCzr/GGABgNXwv74AHwFeiXQfdoYCgckKCH1icHJxoBk2NsmHAC6AAeBu8BlQIk+ySrdFht3FZgLtAGbqgXgEjYOwzegR2hAmIF9wC3gDKAcWGGOaporBMft+R5gIzDRZOnY3wlsA+7ZK+8/S/oYqAbA05B8ZDhNFdIar4GPwNZAdZOMjhgr0vxCk5tY6tB8AFRt+iZIaB5wycOAexy1D7SYxpXIWkN/CobLAzkqGYkBSU8leKXJqmoAGijdSX9xLax3XxI7Gw9MBnJ2viVn1P6iV1wVESXybOCafaYCcAhYnQBAVzGi2LUkAKowcl6b2gKbJEb2hjZIJavAKkBHgVc+ecaVUcloiuk0CsdyK6NJVSjY7xiYCqwHLgI/rbQGd3hVrjnGkNhQpYpsSTuxNL7GFpHmVZNVUfpY8oWNJjGg8RsAleC3pnVd60QdUfoB7w3css4CcPMUpa72RXtE1oPZL+ANMDxGotq4fgOP4/akJAYSUiC37sPAKjs7af/wtkYEENxLEu+sGhGAKpWakjxRqo0IIJUuSwCpwpXD4JKBHIKaymTJQKpw5TC4KRgo/E9McRdVOZBeU5Ot7tyhiyh3N1PTFXI01v4mFzw4BV/zclw3s2m9FF2wN7jm+leDzKGphwHfPU49fOnUmn8Bhg+5xswBadMAAAAASUVORK5CYII="
img.onload = e => {
orgCanvasCtx.drawImage(e.target, 0, 0)
}
document.querySelector(`button`).onclick = () => {
// Getting start crop after orgCanvas is ready.
const quality = 1.0
const blobURL = orgCanvas.toDataURL(`image/png`, quality)
const cropImg = new Image()
cropImg.src = blobURL
cropImg.dataset.cropOptions = JSON.stringify({ // like <img data-crop-options="...">
x: 3, y: 10, width: 15, height: 26
})
cropImg.onload = () => {
URL.revokeObjectURL(cropImg.src)
if (cropImg.dataset.cropOptions === "") {
return
}
const {x, y, width, height} = JSON.parse(cropImg.dataset.cropOptions)
const cropCanvas = document.createElement(`canvas`);
[cropCanvas.width, cropCanvas.height] = [width, height]
const cropCanvasCtx = cropCanvas.getContext(`2d`)
cropCanvasCtx.drawImage(cropImg,
x, y, width, height,
0, 0, width, height, // paste it to the left upper corner
)
cropImg.dataset.cropOptions = "" // stop callback
cropImg.src = cropCanvas.toDataURL(`image/png`, quality) // it will do cropImg.onload again ...
}
document.body.append(cropImg)
}
}
</script>