The last one is easy. An image from Canvas is already in Base64 format. You just need to use this block
The other two requires either AJAX or Node.js libraries if needed as independent extensions but the image from photo library and image from camera are already supported by my Web Viewer so practically it is all supported.
I already saw your demo, but when image of canvas is resize, image is no more in base64 format. For the two other point I don’t want to click on button on web_viewer