OK I just spent like 3 days figuring this out.. so.. here goes!
You take a screenshot with CanvasSnapshot. You already know that. My chrome bugs out if I try to use the snapshot on the same frame it was generated so I put a 0.1 second wait after it.
You can take that screenshot and download it locally like in the example app. If you want to send it elsewhere, the CanvasSnapshot system expression contains a Base64 encoded PNG image prepended with the MIME type and set off the from the actual data with a comma. If you strip off the crap in the front and URLEncode the data you can send that via an Ajax POST action. You can do both of these in a single action; I set my post variable to ""imagedata=" & URLEncode(replace(CanvasSnapshot, "data:image/png;base64,", ""))" and just post that since I use GET parameters for everything else.
On the server side, remember that PHP automatically URL decodes so you just need to do base64_decode on your POST data. Don't do a manual urldecode or you'll corrupt your data. Once you do all that you'll have your PNG screenshot data in PHP and you can do whatever you want with it.
As for screenshotting certain things, all you can do in Construct is take a snapshot of the entire canvas. You can edit it in GD on the server side if you want to though to crop out what you don't want.