You can get the worlds image by calling getBackground() from the world subclass. Introduce a variable (say GreenfootImage world_image) and assign it with world_image = getBackground();
I think the short answer is "no".
The long answer is that you can get the background image of the world, duplicate it (by painting it into a new image), and then manually paint all the objects in the world at the correct position and rotation. It's not simple to do and you may not be able to guarantee that you paint the objects in the same order as Greenfoot does.
Certainly. You can get a BufferedImage instance from a GreenfootImage by calling the getAwtImage() method and then you can use the standard Java API to write that to a file. For this, Google is your friend. Here's a couple of links - one, two .