The recalculate is unnecessary, if you pass the image's size into the constructor.
The rest should be simple vector math.
// Define a point on the image shape's boundary (where it is located). We start with the pick ray's origin...
Point3f boundary = new Point3f( pr.getOrigin() );
// Set the pick ray's length to the distance from canvas to the image shape.
pr.getDirection().normalize();
pr.getDirection().setLength( absDistanceCanvasToImage );
// ...and add the pick ray's direction vector.
boundary.add( pr.getDirection() );
// Define the center of the image shape (where it is located).
Point3f center = new Point3f( 0f, 0f, -absDistanceCanvasToImage );
// The distance from 'center' to 'boundary' is half of the image shape's height (where it is located).
float height = center.distanceTo( boundary ) * 2f;
The width can now be calculated by using the image's aspect ratio and the calculated height.
The code is untested and written straight from my head. But it should basically work.
Marvin