What I normally do is the following:
load the sprite sheet
for each sprite in the sprite sheet
create a new image (im)
draw the sprite in the sprite sheet to the new image
Yes, you would have to specify the (x,y) coordinates and width and height in the draw image method.
The only pitfall here is that transparent pixels won’t be copied as transparent pixels (instead, you’ll wind up with black because that’s what the new image is initialized to). Typically, I have the sprite sheet use a “special” color for transparency and then convert it to alpha channel transparency AFTER copying the images.
A better alternative would be just to extract the pixel data from the sprite sheet’s image (as an int[][]) and then create the new image from the int[][].